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 相关文章推荐
用libtemplate实现静态网页生成
Oct 09 PHP
解析如何用php screw加密php源代码
Jun 20 PHP
PHP错误Parse error: syntax error, unexpected end of file in test.php on line 12解决方法
Jun 23 PHP
phpnow php探针环境检测代码
Nov 04 PHP
ThinkPHP中I(),U(),$this-&gt;post()等函数用法
Nov 22 PHP
PHP获取当前完整URL地址的函数
Dec 21 PHP
使用GD库生成带阴影文字的图片
Mar 27 PHP
PHP中的表达式简述
May 29 PHP
php使用get_class_methods()函数获取分类的方法
Jul 20 PHP
thinkphp5.0自定义验证规则使用方法
Nov 16 PHP
PHP面向对象之里氏替换原则简单示例
Apr 08 PHP
PHP实现数组根据某个单元字段排序操作示例
Aug 01 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 用sock技术发送邮件的函数
2007/07/21 PHP
如何使用微信公众平台开发模式实现多客服
2016/01/06 PHP
Laravel框架学习笔记之批量更新数据功能
2019/05/30 PHP
javascript 鼠标滚轮事件
2009/04/09 Javascript
javascript笔记 String类replace函数的一些事
2011/09/22 Javascript
Jquery 数组操作大全个人总结
2013/11/13 Javascript
javascript面向对象之共享成员属性与方法及prototype关键字用法
2015/01/13 Javascript
web前端开发JQuery常用实例代码片段(50个)
2015/08/28 Javascript
使用递归遍历对象获得value值的实现方法
2016/06/14 Javascript
webpack打包后直接访问页面图片路径错误的解决方法
2017/06/17 Javascript
浅谈webpack4 图片处理汇总
2018/09/12 Javascript
浅谈vue项目4rs vue-router上线后history模式遇到的坑
2018/09/27 Javascript
Vant的安装和配合引入Vue.js项目里的方法步骤
2018/12/05 Javascript
JS定时器如何实现提交成功提示功能
2020/06/12 Javascript
[01:33]DOTA2上海特级锦标赛 LIQUID战队完整宣传片
2016/03/16 DOTA
[01:01]青春无憾,一战成名——DOTA2全国高校联赛开启
2018/02/25 DOTA
解决Python出现_warn_unsafe_extraction问题的方法
2016/03/24 Python
Python简直是万能的,这5大主要用途你一定要知道!(推荐)
2019/04/03 Python
在python中实现调用可执行文件.exe的3种方法
2019/07/07 Python
利用python开发app实战的方法
2019/07/09 Python
windows中安装Python3.8.0的实现方法
2019/11/19 Python
python上传时包含boundary时的解决方法
2020/04/08 Python
CSS3——齿轮转动关键代码
2013/05/02 HTML / CSS
酒店个人培训自我鉴定
2013/12/11 职场文书
自我评价200字分享
2013/12/17 职场文书
2014学校庆三八妇女节活动总结
2014/03/01 职场文书
公司财务流程之主管工作流程
2014/03/03 职场文书
父母对孩子说的话
2014/04/12 职场文书
市场调研项目授权委托书范本
2014/10/04 职场文书
2014年反洗钱工作总结
2014/11/22 职场文书
社区五一劳动节活动总结
2015/02/09 职场文书
党员带头倡议书
2015/04/29 职场文书
电台广播稿范文
2015/08/19 职场文书
中国古代史学名著《战国策》概述
2019/08/09 职场文书
golang elasticsearch Client的使用详解
2021/05/05 Golang
Redis sentinel哨兵集群的实现步骤
2022/07/15 Redis