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 相关文章推荐
模仿OSO的论坛(二)
Oct 09 PHP
php网页标题中文乱码的有效解决方法
Mar 05 PHP
访问编码后的中文URL返回404错误的解决方法
Aug 20 PHP
Windows下编译PHP5.4和xdebug全记录
Apr 03 PHP
如何使用php实现评委评分器
Jul 31 PHP
10个超级有用的PHP代码片段果断收藏
Sep 23 PHP
ThinkPHP设置禁止百度等搜索引擎转码(简单实用)
Feb 15 PHP
thinkphp中U方法按路由规则生成url的方法
Mar 12 PHP
PHP实现微信小程序人脸识别刷脸登录功能
May 24 PHP
php json转换相关知识(小结)
Dec 21 PHP
PHP常见加密函数用法示例【crypt与md5】
Jan 27 PHP
PHP时间相关常用函数用法示例
Jun 03 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实现websocket通信的方法示例
2018/08/28 PHP
如何通过Apache在本地配置多个虚拟主机
2020/07/29 PHP
javascript测试题练习代码
2012/10/10 Javascript
javascript通过class来获取元素实现代码
2013/02/20 Javascript
js调用iframe实现打印页面内容的方法
2014/03/04 Javascript
一些老手都不一定知道的JavaScript技巧
2014/05/06 Javascript
javascript面向对象之对象的深入理解
2015/01/13 Javascript
JavaScript获取当前网页标题(title)的方法
2015/04/03 Javascript
微信小程序 后台https域名绑定和免费的https证书申请详解
2016/11/10 Javascript
bootstrap table 数据表格行内修改的实现代码
2017/02/13 Javascript
jQuery图片切换动画效果
2017/02/28 Javascript
jQuery中table数据的值拷贝和拆分
2017/03/19 Javascript
JavaScript简单实现合并两个Json对象的方法示例
2017/10/16 Javascript
了解ESlint和其相关操作小结
2018/05/21 Javascript
使用angularjs.foreach时return的问题解决
2018/09/30 Javascript
详解vue中this.$emit()的返回值是什么
2019/04/07 Javascript
使用vue-cli3 创建vue项目并配置VS Code 自动代码格式化 vue语法高亮问题
2019/05/14 Javascript
layerui代码控制tab选项卡,添加,关闭的实例
2019/09/04 Javascript
解决layui使用layui-icon出现默认图标的问题
2019/09/11 Javascript
vue实现鼠标经过动画
2019/10/16 Javascript
基于vue的video播放器的实现示例
2021/02/19 Vue.js
[06:16]DOTA2守卫传承者——职业选手谈心路历程
2015/02/26 DOTA
关于你不想知道的所有Python3 unicode特性
2014/11/28 Python
python实现决策树C4.5算法详解(在ID3基础上改进)
2017/05/31 Python
Python实现文件信息进行合并实例代码
2018/01/17 Python
python config文件的读写操作示例
2019/09/27 Python
python 截取XML中bndbox的坐标中的图像,另存为jpg的实例
2020/03/10 Python
专业销售业务员求职信
2013/11/18 职场文书
酒店中秋节促销方案
2014/01/30 职场文书
火车的故事教学反思
2014/02/11 职场文书
工商行政管理专业求职书
2014/05/23 职场文书
孔子观后感
2015/06/08 职场文书
同学会感言
2015/07/30 职场文书
详解Oracle块修改跟踪功能
2021/11/07 Oracle
Java数组详细介绍及相关工具类
2022/04/14 Java/Android
Python实现简单得递归下降Parser
2022/05/02 Python