PHP中使用crypt()实现用户身份验证的代码


Posted in PHP onSeptember 05, 2012

了解crypt()

只要有一点使用非Windows平台经验的读者都可能对crypt()相当熟悉,这一函数完成被称作单向加密的功能,它可以加密一些明码,但不能反过来将密码重新转换为原来的明码。crypt()函数定义如下。

string crypt (string input_string [, string salt])

其中,input_string参数是需要加密的明文字符串,第二个可选的salt是一个位字串,能够影响加密的暗码,进一步排除被破解的可能性。缺省情况下,PHP使用一个2个字符的DES干扰串,如果系统使用的是MD5(参考下一节内容),PHP则会使用一个12个字符的干扰串。可以通过执行下面的命令发现系统将要使用的干扰串的长度。

print "My system salt size is: ". CRYPT_SALT_LENGTH;

crypt()支持4种加密算法,表19.1显示了其支持的算法和相应的salt参数的长度。

表crypt()支持四种加密算法

算法 Salt长度
CRYPT_STD_DES 2-character (Default)
CRYPT_EXT_DES 9-character
CRYPT_MD5 12-character beginning with $1$
CRYPT_BLOWFISH 16-character beginning with $2$

从表面上看,crypt()的函数似乎没有什么用处,但该函数的确被广泛用来保证系统密码的完整性。因为,单向加密的口令即使落入第三方的手里,由于不能被还原为明文,也没有什么大用处。

用crypt()实现用户身份验证

上一部分简单介绍了crypt()函数的功能,下面利用其来实现用户的身份验证,其所要实现的目标同19.2.3节所介绍的一致。

<!--check_user_crypt.php:使用crypt() 函数验证用户----------------> 
<?php 
$user_name=$_POST["user_name"]; 
require_once("sys_conf.inc"); //系统配置文件,包含数据库配置信息 
//连接数据库 
$link_id=mysql_connect($DBHOST,$DBUSER,$DBPWD); 
mysql_select_db($DBNAME); //选择数据库my_chat 
//查询是否存在登录用户信息 
$str="select name,password from user where name ='$user_name'"; 
$result=mysql_query($str,$link_id); //执行查询 
@$rows=mysql_num_rows($result); //取得查询结果的记录笔数 
$user_name=$_SESSION["user_name"]; 
$password=$_POST["password"]; 
$salt = substr($password, 0, 2); 
$password_en=crypt($password,$salt); //使用crypt()对用户密码进行加密 
//对于老用户 
if($rows!=0) 
{ 
list($name,$pwd)=mysql_fetch_row($result); 
//如果密码输入正确 
if($pwd==$password_en) 
{ 
$str="update user set is_online =1 where name ='$user_name' and password='$password_en'"; 
$result=mysql_query($str, $link_id);//执行查询 
require("main.php"); //转到聊天页面 
} 
//密码输入错误 
else 
{ 
require("relogin.php"); 
} 
} 
//对于新用户,将其信息写入数据库 
else 
{ 
$str="insert into user (name,password,is_online) values('$user_ name','$password_en',1)"; 
$result=mysql_query($str, $link_id); //执行查询 
require("main.php"); //转到聊天页面 
} 
//关闭数据库 
mysql_close($link_id); 
?>

示例与上一节所介绍的使用XOR加密算法来保护用户信息非常类似,其核心部分在于第16、17行使用crypt()函数获取加密后的密码,而通过在第25行比较数据库中的密码和加密后的密码是否相等来检查用户是否合法。

下面,通过一个实例来看一下加密后的密码会变成什么样子。

例如,用户名为rock,密码为123456,则加密后的密码为:

12tir.zIbWQ3c

上面就实现了一个简单的用户身份验证系统。在使用crypt()保护重要的机密信息时,需要注意的是,在缺省状态下使用crypt()并不是最安全的,只能用在对安全性要求较低的系统中。

PHP 相关文章推荐
PHP操作文件类的函数代码(文件和文件夹创建,复制,移动和删除)
Nov 10 PHP
php实现批量下载百度云盘文件例子分享
Apr 10 PHP
标准版Eclipse搭建PHP环境的详细步骤
Nov 18 PHP
php HTML无刷新提交表单
Apr 05 PHP
PHP+MYSQL实现读写分离简单实战
Mar 13 PHP
PHP中Notice错误常见解决方法
Apr 28 PHP
yii2.0整合阿里云oss删除单个文件的方法
Sep 19 PHP
PHP实现打包下载文件的方法示例
Oct 07 PHP
PHP定义字符串的四种方式详解
Feb 06 PHP
php微信开发之关键词回复功能
Jun 13 PHP
php项目中类的自动加载实例讲解
Sep 12 PHP
php并发加锁问题分析与设计代码实例讲解
Feb 26 PHP
通过缓存数据库结果提高PHP性能的原理介绍
Sep 05 #PHP
PHP中使用foreach和引用导致程序BUG的问题介绍
Sep 05 #PHP
php循环语句 for()与foreach()用法区别介绍
Sep 05 #PHP
PHP手机号码归属地查询代码(API接口/mysql)
Sep 04 #PHP
PHP获取用户的浏览器与操作系统信息的代码
Sep 04 #PHP
PHP中根据IP地址判断城市实现城市切换或跳转代码
Sep 04 #PHP
PHP中“简单工厂模式”实例代码讲解
Sep 04 #PHP
You might like
《忧国的莫里亚蒂》先导宣传图与STAFF公开
2020/03/04 日漫
php echo()和print()、require()和include()函数区别说明
2010/03/27 PHP
php打造智能化的柱状图程序,用于报表等
2015/06/19 PHP
jquery模拟按下回车实现代码
2011/09/20 Javascript
为EasyUI的Tab标签添加右键菜单的方法
2012/07/14 Javascript
js或者jquery判断图片是否加载完成实现代码
2013/03/20 Javascript
如何学习Javascript入门指导
2013/11/01 Javascript
wangEditor编辑器失去焦点后仍然可以在原位置插入图片分析
2015/05/06 Javascript
简单的jQuery拖拽排序效果的实现(增强动态)
2017/02/09 Javascript
JS实现页面打印(整体、局部)
2017/08/18 Javascript
JS/jQuery实现DIV延时几秒后消失或显示的方法
2018/02/12 jQuery
vue项目中使用lib-flexible解决移动端适配的问题解决
2018/08/23 Javascript
javascript实现弹出层效果
2019/12/10 Javascript
vuecli3.x中轻松4步带你使用tinymce的步骤
2020/06/25 Javascript
js+cavans实现图片滑块验证
2020/09/29 Javascript
[07:12]2014DOTA2西雅图国际邀请赛 黑马Liquid专题采访
2014/07/12 DOTA
phpsir 开发 一个检测百度关键字网站排名的python 程序
2009/09/17 Python
详谈套接字中SO_REUSEPORT和SO_REUSEADDR的区别
2018/04/28 Python
python中验证码连通域分割的方法详解
2018/06/04 Python
基于python3实现socket文件传输和校验
2018/07/28 Python
python实现超市管理系统(后台管理)
2019/10/25 Python
python GUI库图形界面开发之PyQt5信号与槽事件处理机制详细介绍与实例解析
2020/03/08 Python
在python中利用pycharm自定义代码块教程(三步搞定)
2020/04/15 Python
学python最电脑配置有要求么
2020/07/05 Python
Python3获取cookie常用三种方案
2020/10/05 Python
HTML5 Canvas实现图片缩放、翻转、颜色渐变的代码示例
2016/02/28 HTML / CSS
自我鉴定怎么写
2013/12/05 职场文书
珠宝店促销方案
2014/03/21 职场文书
合作经营协议书范本
2014/04/17 职场文书
爱国主义教育活动总结
2014/05/07 职场文书
校园绿化美化方案
2014/06/08 职场文书
社区母亲节活动总结
2015/02/10 职场文书
财务工作个人总结
2015/02/27 职场文书
2015年公共机构节能宣传周活动总结
2015/03/26 职场文书
MySQL基础(一)
2021/04/05 MySQL
python turtle绘制多边形和跳跃和改变速度特效
2022/03/16 Python