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 23 PHP
一个图形显示IP的PHP程序代码
Oct 19 PHP
用PHP调用Oracle存储过程的方法
Sep 12 PHP
40个迹象表明你还是PHP菜鸟
Sep 29 PHP
学习使用curl采集curl使用方法
Jan 11 PHP
那些年一起学习的PHP(一)
Mar 21 PHP
PHP人民币金额数字转中文大写的函数代码
Feb 27 PHP
php递归删除目录下的文件但保留的实例分享
May 10 PHP
php单例模式实现方法分析
Mar 14 PHP
解决laravel 5.1报错:No supported encrypter found的办法
Jun 07 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
Nov 10 PHP
PHP序列化和反序列化深度剖析实例讲解
Dec 29 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 方便水印和缩略图的图形类
2009/05/21 PHP
PHP获取文件绝对路径的代码(上一级目录)
2011/05/29 PHP
Yii实现单用户博客系统文章详情页插入评论表单的方法
2015/12/28 PHP
最新最全PHP生成制作验证码代码详解(推荐)
2016/06/12 PHP
PHP pthreads v3在centos7平台下的安装与配置操作方法
2020/02/21 PHP
让回调函数 showResponse 也带上参数的代码
2007/08/13 Javascript
js 利用image对象实现图片的预加载提高访问速度
2013/03/29 Javascript
将文本输入框内容加入表中的js代码
2013/08/18 Javascript
9行javascript代码获取QQ群成员具体实现
2013/10/16 Javascript
jQuery取id有.的值的方法
2014/05/21 Javascript
深入理解javascript构造函数和原型对象
2014/09/23 Javascript
js实现鼠标滚轮控制图片缩放效果的方法
2015/02/20 Javascript
jquery中ready()函数执行的时机和window的load事件比较
2015/06/22 Javascript
jQuery文件上传控件 Uploadify 详解
2016/06/20 Javascript
JS实现的表格行上下移动操作示例
2016/08/03 Javascript
chrome浏览器如何断点调试异步加载的JS
2016/09/05 Javascript
nodejs6下使用koa2框架实例
2017/05/18 NodeJs
vue项目实现记住密码到cookie功能示例(附源码)
2018/01/31 Javascript
node打造微信个人号机器人的方法示例
2018/04/26 Javascript
JS实现的透明度渐变动画效果示例
2018/04/28 Javascript
记录一篇关于redux-saga的基本使用过程
2018/08/18 Javascript
深入理解JavaScript 中的执行上下文和执行栈
2018/10/23 Javascript
webpack4 配置 ssr 环境遇到“document is not defined”
2019/10/24 Javascript
JS事件循环机制event loop宏任务微任务原理解析
2020/08/04 Javascript
[01:05:56]2018DOTA2亚洲邀请赛3月29日 小组赛A组 Newbee VS VG
2018/03/30 DOTA
python连接mysql调用存储过程示例
2014/03/05 Python
详解Django的model查询操作与查询性能优化
2018/10/16 Python
python lxml中etree的简单应用
2019/05/10 Python
Python延迟绑定问题原理及解决方案
2020/08/04 Python
外企C语言笔试题
2013/11/10 面试题
红领巾广播站广播稿
2014/02/01 职场文书
个人四风问题整改措施思想汇报
2014/10/04 职场文书
2014年少先队工作总结
2014/12/03 职场文书
商超业务员岗位职责
2015/02/13 职场文书
用python删除文件夹中的重复图片(图片去重)
2021/05/12 Python
MySQL中B树索引和B+树索引的区别详解
2022/03/03 MySQL