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 相关文章推荐
VFP与其他应用程序的集成
Oct 09 PHP
第十二节--类的自动加载
Nov 16 PHP
动易数据转成dedecms的php程序
Apr 07 PHP
coreseek 搜索英文的问题详解
Jun 08 PHP
php缩小png图片不损失透明色的解决方法
Dec 25 PHP
php检测用户是否用手机(Mobile)访问网站的类
Jan 09 PHP
thinkphp路由规则使用示例详解和伪静态功能实现(apache重写)
Feb 24 PHP
微信公众平台开发之天气预报功能
Aug 31 PHP
PHP使用trim函数去除字符串左右空格及特殊字符实例
Jan 07 PHP
php生成无限栏目树
Mar 16 PHP
PHP设计模式之委托模式定义与用法简单示例
Aug 13 PHP
php进程(线程)通信基础之System V共享内存简单实例分析
Nov 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
实例讲解PHP面向对象之多态
2014/08/20 PHP
php判断文件夹是否存在不存在则创建
2015/04/09 PHP
yii通过小物件生成view的方法
2016/10/08 PHP
ThinkPHP5&amp;5.1实现验证码的生成、使用及点击刷新功能示例
2020/02/07 PHP
javascript parseInt与Number函数的区别
2010/01/21 Javascript
JQuery中使用Ajax赋值给全局变量异常的解决方法
2014/01/10 Javascript
jQuery淡入淡出元素让其效果更为生动
2014/09/01 Javascript
node.js中的console.log方法使用说明
2014/12/09 Javascript
javascript实现随机读取数组的方法
2015/08/03 Javascript
JavaScript实现身份证验证代码
2016/02/17 Javascript
JS与jQuery实现子窗口获取父窗口元素值的方法
2017/04/17 jQuery
jquery实现回车键触发事件(实例讲解)
2017/11/21 jQuery
vue实现模态框的通用写法推荐
2018/02/26 Javascript
koa socket即时通讯的示例代码
2018/09/07 Javascript
浅谈webpack devtool里的7种SourceMap模式
2019/01/14 Javascript
微信小程序学习笔记之目录结构、基本配置图文详解
2019/03/28 Javascript
vue改变对象或数组时的刷新机制的方法总结
2019/04/24 Javascript
Vue Router的手写实现方法实现
2020/03/02 Javascript
JavaScript进阶(二)词法作用域与作用域链实例分析
2020/05/09 Javascript
OpenLayers实现图层切换控件
2020/09/25 Javascript
Python2.x与Python3.x的区别
2016/01/14 Python
使用python将图片格式转换为ico格式的示例
2018/10/22 Python
python使用正则表达式去除中文文本多余空格,保留英文之间空格方法详解
2020/02/11 Python
keras实现图像预处理并生成一个generator的案例
2020/06/17 Python
python 两种方法删除空文件夹
2020/09/29 Python
CSS3中伪元素::before和::after的用法示例
2017/09/18 HTML / CSS
瑞典领先的汽车零部件网上零售商:bildelaronline24.se
2017/01/12 全球购物
美国背景检查、公共记录和人物搜索网站:BeenVerified
2018/02/25 全球购物
加州风格的游泳和沙滩装品牌:Cupshe
2019/06/10 全球购物
介绍一下grep命令的使用
2015/06/12 面试题
村干部任职承诺书
2015/01/21 职场文书
支行行长岗位职责
2015/02/15 职场文书
环保宣传语大全
2015/07/13 职场文书
小学语文教师竞聘演讲稿范文
2019/08/09 职场文书
漫画「日和酱的要求是绝对的」第3卷封面公开
2022/03/21 日漫
win10输入法不见了只能打出字母怎么解决?
2022/08/05 数码科技