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调用数据库的存贮过程!
Oct 09 PHP
snoopy PHP版的网络客户端提供本地下载
Apr 15 PHP
php 前一天或后一天的日期
Jun 28 PHP
php相当简单的分页类
Oct 02 PHP
js代码实现微博导航栏
Jul 30 PHP
CI框架出现mysql数据库连接资源无法释放的解决方法
May 17 PHP
DWZ+ThinkPHP开发时遇到的问题分析
Dec 12 PHP
通过php动态传数据到highcharts
Apr 05 PHP
PHP strripos函数用法总结
Feb 11 PHP
laravel框架查询数据集转为数组的两种方法
Oct 10 PHP
Yii中特殊行为ActionFilter的使用方法示例
Oct 18 PHP
PHP中SESSION过期设置
Mar 09 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
用Flash图形化数据(二)
2006/10/09 PHP
Smarty+QUICKFORM小小演示
2007/02/25 PHP
PHP中CheckBox多选框上传失败的代码写法
2017/02/13 PHP
php实现的双色球算法示例
2017/06/20 PHP
PHP多线程模拟实现秒杀抢单
2018/02/07 PHP
tp5.1 实现setInc字段自动加1
2019/10/18 PHP
分享20款好玩的jQuery游戏
2011/04/17 Javascript
仿微博字符限制效果实现代码
2012/04/20 Javascript
js将iframe中控件的值传到主页面控件中的实现方法
2013/03/11 Javascript
完美解决AJAX跨域问题
2013/11/01 Javascript
jquery访问ashx文件示例代码
2014/08/11 Javascript
jQuery选择器全集详解
2014/11/24 Javascript
js获取对象、数组的实际长度,元素实际个数的实现代码
2016/06/08 Javascript
BootStrap整体框架之基础布局组件
2016/12/15 Javascript
nodejs个人博客开发第六步 数据分页
2017/04/12 NodeJs
jQuery树插件zTree使用方法详解
2017/05/02 jQuery
ES6学习教程之对象字面量详解
2017/10/09 Javascript
NodeJS 中Stream 的基本使用
2018/07/30 NodeJs
swiper在angularjs中使用循环轮播失效的解决方法
2018/09/27 Javascript
[02:21]DOTA2英雄基础教程 蝙蝠骑士
2013/12/16 DOTA
[48:11]完美世界DOTA2联赛 Magma vs GXR 第二场 11.07
2020/11/10 DOTA
Python中for循环详解
2014/01/17 Python
解决python测试opencv时imread导致的错误问题
2019/01/26 Python
Python 使用 docopt 解析json参数文件过程讲解
2019/08/13 Python
Python3.7+tkinter实现查询界面功能
2019/12/24 Python
Python3打包exe代码2种方法实例解析
2020/02/17 Python
基于python+selenium自动健康打卡的实现代码
2021/01/13 Python
CSS3教程(10):CSS3 HSL声明设置颜色
2009/04/02 HTML / CSS
BNKR中国官网:带你感受澳洲领先潮流时尚
2018/08/21 全球购物
西铁城美国官方网站:Citizen Watch美国
2019/11/08 全球购物
购买原创艺术品:Zatista
2019/11/09 全球购物
企业承诺书怎么写
2014/05/24 职场文书
党的群众路线教育实践活动查摆剖析材料
2014/10/10 职场文书
2014年度培训工作总结
2014/11/27 职场文书
运动会开幕式通讯稿
2015/07/18 职场文书
Zabbix对Kafka topic积压数据监控的问题(bug优化)
2022/07/07 Servers