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 相关文章推荐
PHP5.0正式发布 不完全兼容PHP4 新增多项功能
Oct 09 PHP
PHP 选项及相关信息函数库
Dec 04 PHP
php 图片上传类代码
Jul 17 PHP
php下关于中英数字混排的字符串分割问题
Apr 06 PHP
PHP中的数组处理函数实例总结
Jan 09 PHP
PHP使用pear实现mail发送功能 windows环境下配置pear
Apr 15 PHP
php使用FFmpeg接口获取视频的播放时长、码率、缩略图以及创建时间
Nov 07 PHP
CakePHP框架Session设置方法分析
Feb 23 PHP
PHP addcslashes()函数讲解
Feb 03 PHP
PHP反射实际应用示例
Apr 03 PHP
PHP面向对象程序设计内置标准类,普通数据类型转为对象类型示例
Jun 12 PHP
laravel5环境隐藏index.php后缀(apache)的方法
Oct 12 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
如何选购合适的收音机
2021/03/01 无线电
PHP正确配置mysql(apache环境)
2011/08/28 PHP
PHP的全局错误处理详解
2016/04/25 PHP
PHP对XML内容进行修改和删除实例代码
2016/10/26 PHP
基于jquery自定义图片热区效果
2012/07/21 Javascript
js跨域问题浅析及解决方法优缺点对比
2014/11/08 Javascript
JavaScript返回网页中锚点数目的方法
2015/04/03 Javascript
JS实现下拉菜单赋值到文本框的方法
2015/08/18 Javascript
JS常见问题之为什么点击弹出的i总是最后一个
2016/01/05 Javascript
微信小程序自定义模态对话框实例详解
2017/08/16 Javascript
ES6中数组array新增方法实例总结
2017/11/07 Javascript
Node.js Stream ondata触发时机与顺序的探索
2019/03/08 Javascript
在layui中select更改后生效的方法
2019/09/05 Javascript
python使用wxPython打开并播放wav文件的方法
2015/04/24 Python
python下如何查询CS反恐精英的服务器信息
2017/01/17 Python
神经网络python源码分享
2017/12/15 Python
python中logging模块的一些简单用法的使用
2019/02/22 Python
75条笑死人的知乎神回复,用60行代码就爬完了
2019/05/06 Python
PyCharm无法识别PyQt5的2种解决方法,ModuleNotFoundError: No module named 'pyqt5'
2020/02/17 Python
配置python的编程环境之Anaconda + VSCode的教程
2020/03/29 Python
Python3之外部文件调用Django程序操作model等文件实现方式
2020/04/07 Python
Python 代码调试技巧示例代码
2020/08/11 Python
最新PyCharm从安装到PyCharm永久激活再到PyCharm官方中文汉化详细教程
2020/11/17 Python
香港优质食材和美酒专门店:FoodWise
2017/09/01 全球购物
英国街头品牌:Bee Inspired Clothing
2018/02/12 全球购物
编码实现字符串转整型的函数
2012/06/02 面试题
J2EE面试题集锦(附答案)
2013/08/16 面试题
董事长岗位职责
2013/11/30 职场文书
历史专业大学生职业生涯规划书
2014/03/13 职场文书
C++程序员求职信范文
2014/04/14 职场文书
办理信用卡收入证明范例
2014/09/13 职场文书
群众路线教育实践活动剖析材料
2014/09/30 职场文书
社区六一儿童节活动总结
2015/02/11 职场文书
人工作失职检讨书
2015/05/05 职场文书
获奖感言一句话
2015/07/31 职场文书
只用20行Python代码实现屏幕录制功能
2021/06/02 Python