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优于Node.js的五大理由分享
Sep 15 PHP
ThinkPHP的模版中调用session数据的方法
Jul 01 PHP
php中JSON的使用方法
Apr 30 PHP
PHP多态代码实例
Jun 26 PHP
php统计数组元素个数的方法
Jul 02 PHP
PHP互换两个变量值的方法(不用第三变量)
Nov 14 PHP
微信自定义分享php代码分析
Nov 24 PHP
php获取POST数据的三种方法实例详解
Dec 20 PHP
解决form中action属性后面?传递参数 获取不到的问题
Jul 21 PHP
PHP echo()函数讲解
Feb 15 PHP
ThinkPHP5.0框架验证码功能实现方法【基于第三方扩展包】
Mar 11 PHP
PHP实现获取文件mime类型多种方法解析
May 28 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/12/11 PHP
PHP 引用文件技巧
2010/03/02 PHP
php加密解密实用类分享
2014/01/07 PHP
php中关于长度计算容易混淆的问题分析
2016/05/27 PHP
PHP实践教程之过滤、验证、转义与密码详解
2017/07/24 PHP
PHP Socket网络操作类定义与用法示例
2017/08/30 PHP
slice函数的用法 之不错的应用
2006/12/29 Javascript
关于innerHTML后丢失动态绑定的EVENT问题解决方法
2013/05/19 Javascript
纯Javascript实现Windows 8 Metro风格实现
2013/10/15 Javascript
js判断undefined类型示例代码
2014/02/10 Javascript
JavaScript更改字符串的大小写
2015/05/07 Javascript
Javascript HTML5 Canvas实现的一个画板
2020/04/12 Javascript
js Canvas绘制圆形时钟效果
2017/02/17 Javascript
javascript连接mysql与php通过odbc连接任意数据库的实例
2017/12/27 Javascript
详解Vue iview IE浏览器不兼容报错(Iview Bable polyfill)
2019/01/07 Javascript
微信小程序设置滚动条过程详解
2019/07/25 Javascript
javascript 模块依赖管理的本质深入详解
2020/04/30 Javascript
nuxt 页面路由配置,主页轮播组件开发操作
2020/11/05 Javascript
JavaScript canvas实现跟随鼠标移动小球
2021/02/09 Javascript
[39:02]DOTA2亚洲邀请赛 3.31 小组赛 B组 Mineski vs VGJ.T
2018/04/01 DOTA
跟老齐学Python之编写类之一创建实例
2014/10/11 Python
python下setuptools的安装详解及No module named setuptools的解决方法
2017/07/06 Python
python 生成图形验证码的方法示例
2018/11/11 Python
Python设计模式之桥接模式原理与用法实例分析
2019/01/10 Python
python orm 框架中sqlalchemy用法实例详解
2020/02/02 Python
Python函数的迭代器与生成器的示例代码
2020/06/18 Python
python map比for循环快在哪
2020/09/21 Python
python用700行代码实现http客户端
2021/01/14 Python
canvas压缩图片以及卡片制作的方法示例
2018/12/04 HTML / CSS
土木工程实习生自我鉴定
2013/09/19 职场文书
财务会计大学生自我评价
2014/04/09 职场文书
平安校园建设方案
2014/05/02 职场文书
任命书模板
2014/06/04 职场文书
企业法人代表证明书
2014/09/27 职场文书
群众路线教育实践活动学习笔记
2014/11/05 职场文书
手把手教你制定暑期学习计划,让你度过充实的暑假
2019/08/22 职场文书