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 相关文章推荐
第八节 访问方式 [8]
Oct 09 PHP
Win9x/ME下Apache+PHP安装配置
Oct 09 PHP
PHP教程 变量定义
Oct 23 PHP
PHP函数篇之掌握ord()与chr()函数应用
Dec 05 PHP
php截取字符串之截取utf8或gbk编码的中英文字符串示例
Mar 12 PHP
YII2.0之Activeform表单组件用法实例
Jan 09 PHP
PHP 接入微信扫码支付总结(总结篇)
Nov 03 PHP
详解如何在云服务器上部署Laravel
Jun 30 PHP
Windows平台实现PHP连接SQL Server2008的方法
Jul 26 PHP
PHP利用递归函数实现无限级分类的方法
Mar 22 PHP
PHP多进程简单实例小结
Nov 09 PHP
php访问对象中的成员的实例方法
Nov 17 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
php制作中间带自己定义图片二维码的方法
2014/01/27 PHP
thinkphp中U方法按路由规则生成url的方法
2018/03/12 PHP
PHP实现随机发扑克牌
2020/04/22 PHP
推荐一些非常不错的javascript学习资源站点
2007/08/29 Javascript
JavaScript Undefined,Null类型和NaN值区别
2008/10/22 Javascript
JavaScript入门之对象与JSON详解
2011/10/21 Javascript
js 数值转换为3位逗号分隔的示例代码
2014/02/19 Javascript
WordPress 单页面上一页下一页的实现方法【附代码】
2016/03/10 Javascript
js动态添加的DIV中的onclick事件简单实例
2016/07/25 Javascript
jQuery Validate让普通按钮触发表单验证的方法
2016/12/15 Javascript
基于javascript实现数字英文验证码
2017/01/25 Javascript
JavaScript如何获取到导航条中HTTP信息
2017/10/10 Javascript
vue.js数据绑定操作详解
2018/04/23 Javascript
快速解决vue在ios端下点击响应延时的问题
2018/08/27 Javascript
重学 JS:为啥 await 不能用在 forEach 中详解
2019/04/15 Javascript
vue cli3.0打包上线静态资源找不到路径的解决操作
2020/08/03 Javascript
微信小程序实现点击导航标签滚动定位到对应位置
2020/11/19 Javascript
react-native 实现购物车滑动删除效果的示例代码
2021/01/15 Javascript
Python中的exec、eval使用实例
2014/09/23 Python
ubuntu环境下python虚拟环境的安装过程
2018/01/07 Python
python3.6根据m3u8下载mp4视频
2019/06/17 Python
Python开发企业微信机器人每天定时发消息实例
2020/03/17 Python
Python如何利用Har文件进行遍历指定字典替换提交的数据详解
2020/11/05 Python
pycharm 实现光标快速移动到括号外或行尾的操作
2021/02/05 Python
Python第三方库安装缓慢的解决方法
2021/02/06 Python
玛蒂尔达简服装:Matilda Jane Clothing
2019/02/13 全球购物
银行营业厅大堂经理岗位职责
2014/01/06 职场文书
农村结婚典礼司仪主持词
2014/03/14 职场文书
工程学毕业生自荐信
2014/06/14 职场文书
2014年售票员工作总结
2014/11/19 职场文书
2015年导购员工作总结
2015/04/25 职场文书
运动会通讯稿300字
2015/07/20 职场文书
一篇文章学会Vue中间件管道
2021/06/20 Vue.js
pytorch分类模型绘制混淆矩阵以及可视化详解
2022/04/07 Python
微软团队与 NASA 科学家和惠普企业(HPE)的工程师合作
2022/04/21 数码科技
使用 DataAnt 监控 Apache APISIX的原理解析
2022/07/07 Servers