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 相关文章推荐
支持oicq头像的留言簿(一)
Oct 09 PHP
PHP中的cookie
Nov 26 PHP
php实现批量压缩图片文件大小的脚本
Jul 04 PHP
php中数字、字符与对象判断函数用法实例
Nov 26 PHP
PHP获取文件夹内文件数的方法
Mar 12 PHP
解析WordPress中函数钩子hook的作用及基本用法
Dec 22 PHP
php自动载入类用法实例分析
Jun 24 PHP
PHP入门教程之日期与时间操作技巧总结(格式化,验证,获取,转换,计算等)
Sep 11 PHP
PHP页面跳转实现延时跳转的方法
Dec 10 PHP
PHP hex2bin()函数用法讲解
Feb 25 PHP
YII框架模块化处理操作示例
Apr 26 PHP
PHP文件上传小程序 适合初学者学习!
May 23 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
JAVA/JSP学习系列之六
2006/10/09 PHP
php实现的在线人员函数库
2008/04/09 PHP
php使用mb_check_encoding检查字符串在指定的编码里是否有效
2013/11/07 PHP
无需数据库在线投票调查php代码
2016/07/20 PHP
js option删除代码集合
2008/11/12 Javascript
JavaScript Accessor实现说明
2010/12/06 Javascript
web前端开发也需要日志
2010/12/09 Javascript
JavaScript中Number.MAX_VALUE属性的使用方法
2015/06/04 Javascript
js验证身份证号有效性并提示对应信息
2015/10/19 Javascript
js操作table元素实现表格行列新增、删除技巧总结
2015/11/18 Javascript
ionic2 tabs 图标自定义实例
2017/03/08 Javascript
JS实现标签页切换效果
2017/05/04 Javascript
JS实现新建文件夹功能
2017/06/17 Javascript
写gulp遇到的ES6问题详解
2018/12/03 Javascript
400多行Python代码实现了一个FTP服务器
2012/05/10 Python
python中的函数用法入门教程
2014/09/02 Python
浅析python递归函数和河内塔问题
2017/04/18 Python
python2.7 json 转换日期的处理的示例
2018/03/07 Python
python GUI库图形界面开发之PyQt5中QWebEngineView内嵌网页与Python的数据交互传参详细方法实例
2020/02/26 Python
jupyter 实现notebook中显示完整的行和列
2020/04/09 Python
python 实现关联规则算法Apriori的示例
2020/09/30 Python
整理HTML5移动端开发的常用触摸事件
2016/04/15 HTML / CSS
美国钻石商店:Zales
2016/11/20 全球购物
KLOOK客路:发现更好玩的世界,预订独一无二的旅行体验
2016/12/16 全球购物
澳大利亚实惠时尚女装商店:Katies
2019/06/16 全球购物
数字漫画:comiXology
2020/06/13 全球购物
求高于平均分的学生学号及成绩
2016/09/01 面试题
编程用JAVA解析XML的方式
2013/07/07 面试题
生物科学专业个人求职信范文
2013/12/07 职场文书
办公室经理岗位职责
2014/01/01 职场文书
退休感言
2014/01/28 职场文书
借款协议书范本
2014/04/22 职场文书
授权委托书(完整版)
2014/09/10 职场文书
2015关于重阳节的演讲稿
2015/03/20 职场文书
生日祝酒词大全
2015/08/10 职场文书
乡镇团代会开幕词
2016/03/04 职场文书