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 相关文章推荐
sphinx增量索引的一个问题
Jun 14 PHP
PHPEXCEL 使用小记
Jan 06 PHP
php把数据表导出为Excel表的最简单、最快的方法(不用插件)
May 10 PHP
PHP中定义数组常量(array常量)的方法
Nov 17 PHP
修改WordPress中文章编辑器的样式的方法详解
Dec 15 PHP
PHP中key和current,next的联合运用实例分析
Mar 29 PHP
ThinkPHP表单令牌错误的相关解决方法分析
May 20 PHP
PHP基于GD库的图像处理方法小结
Sep 27 PHP
php中实现字符串翻转的方法
Feb 22 PHP
PHP laravel中的多对多关系实例详解
Jun 07 PHP
php+js实现的无刷新下载文件功能示例
Aug 23 PHP
PHP中-&gt;和=&gt;的含义及使用示例解析
Aug 06 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+DBM的同学录程序(4)
2006/10/09 PHP
解析php addslashes()与addclashes()函数的区别和比较
2013/06/24 PHP
PHPThumb图片处理实例
2014/05/03 PHP
php.ini save_handler 修改不生效的解决办法
2014/07/22 PHP
PHP制作用户注册系统
2015/10/23 PHP
Jquery AJAX 用于计算点击率(统计)
2010/06/30 Javascript
jquery.bgiframe.js在IE9下提示INVALID_CHARACTER_ERR错误
2013/01/11 Javascript
文本框回车提交与禁止提交示例
2013/09/27 Javascript
jQuery实现异步获取json数据的2种方式
2014/08/29 Javascript
js实现仿百度瀑布流的方法
2015/02/05 Javascript
jquery渐隐渐显的图片幻灯闪烁切换实现方法
2015/02/26 Javascript
JavaScript的Date()方法使用详解
2015/06/09 Javascript
详解JavaScript数组的操作大全
2015/10/19 Javascript
JavaScript数据结构之二叉树的删除算法示例
2017/04/13 Javascript
JS实现简易的图片拖拽排序实例代码
2017/06/09 Javascript
JS设置随机出现2个数字的实例代码
2017/07/19 Javascript
了解前端理论:rscss和rsjs
2019/05/23 Javascript
[01:02:09]Liquid vs TNC 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21
2020/07/19 DOTA
用Python实现斐波那契(Fibonacci)函数
2016/03/25 Python
Python实现简单的获取图片爬虫功能示例
2017/07/12 Python
pandas把dataframe转成Series,改变列中值的类型方法
2018/04/10 Python
Django框架多表查询实例分析
2018/07/04 Python
python 实现将字典dict、列表list中的中文正常显示方法
2018/07/06 Python
Python设计模式之状态模式原理与用法详解
2019/01/15 Python
对python中url参数编码与解码的实例详解
2019/07/25 Python
使用python库xlsxwriter库来输出各种xlsx文件的示例
2020/09/01 Python
Origins加拿大官网:雅诗兰黛集团高端植物护肤品牌
2017/11/19 全球购物
The North Face官方旗舰店:美国著名户外品牌
2020/09/28 全球购物
this关键字的含义
2015/04/08 面试题
擅自离岗检讨书
2014/02/11 职场文书
师范教师专业大学生职业生涯规划范文
2014/03/02 职场文书
国窖1573广告词
2014/03/21 职场文书
60句有关成长的名言
2019/09/04 职场文书
Mongodb 迁移数据块的流程介绍分析
2022/04/18 MongoDB
微信小程序APP的事件绑定以及传递参数时的冒泡和捕获
2022/04/19 Javascript
前端传参数进行Mybatis调用mysql存储过程执行返回值详解
2022/08/14 MySQL