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 相关文章推荐
不用数据库的多用户文件自由上传投票系统(1)
Oct 09 PHP
《PHP边学边教》(01.开篇――准备工作)
Dec 13 PHP
介绍几个array库的新函数 php
Dec 29 PHP
php与mysql建立连接并执行SQL语句的代码
Jul 04 PHP
php使用异或实现的加密解密实例
Sep 04 PHP
PHP防止注入攻击实例分析
Nov 03 PHP
php实现判断访问来路是否为搜索引擎机器人的方法
Apr 15 PHP
php过滤所有的空白字符(空格、全角空格、换行等)
Oct 27 PHP
PHP解压tar.gz格式文件的方法
Feb 14 PHP
Laravel程序架构设计思路之使用动作类
Jun 07 PHP
laravel框架中间件 except 和 only 的用法示例
Jul 12 PHP
tp5.1 框架数据库-数据集操作实例分析
May 26 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
Oracle Faq(Oracle的版本)
2006/10/09 PHP
使用PHP实现下载CSS文件中的图片
2015/12/06 PHP
php快速导入大量数据的实例方法
2019/09/23 PHP
Discuz! 6.1_jQuery兼容问题
2008/09/23 Javascript
高性能web开发 如何加载JS,JS应该放在什么位置?
2010/05/14 Javascript
jquery键盘事件介绍
2011/01/31 Javascript
formValidator3.3的ajaxValidator一些异常分析
2011/07/12 Javascript
jquery在Chrome下获取图片的长宽问题解决
2013/03/20 Javascript
JQuery筛选器全系列介绍
2013/08/27 Javascript
js中的onchange和onpropertychange (onchange无效的解决方法)
2014/03/08 Javascript
js实现Select下拉框具有输入功能的方法
2015/02/06 Javascript
使用jquery动态加载Js文件和Css文件
2015/10/24 Javascript
jquery.cookie.js用法实例详解
2015/12/25 Javascript
JavaScript代码生成PDF文件的方法
2016/02/26 Javascript
JS正则替换去空格的方法
2017/03/24 Javascript
详解angularJs模块ui-router之状态嵌套和视图嵌套
2017/04/28 Javascript
Node.js使用gm拼装sprite图片
2017/07/04 Javascript
使用async、enterproxy控制并发数量的方法详解
2018/01/02 Javascript
用react-redux实现react组件之间数据共享的方法
2018/06/08 Javascript
实例详解Vue项目使用eslint + prettier规范代码风格
2018/08/20 Javascript
使用jquery Ajax实现上传附件功能
2018/10/23 jQuery
js中innerText/textContent和innerHTML与target和currentTarget的区别
2019/01/21 Javascript
微信小程序 弹窗输入组件的实现解析
2019/08/12 Javascript
Vant picker 多级联动操作
2020/11/02 Javascript
pyqt4教程之实现windows窗口小示例分享
2014/03/07 Python
详解Python验证码识别
2016/01/25 Python
numpy.meshgrid()理解(小结)
2019/08/01 Python
日本民宿预约平台:STAY JAPAN
2017/07/01 全球购物
全球独特生活方式产品和礼品购物网站:AHAlife
2018/09/18 全球购物
社区工作者先进事迹
2014/01/18 职场文书
英语自我评价范文
2014/01/24 职场文书
党性分析自查总结
2014/10/14 职场文书
党的群众路线教育实践活动心得体会(企业)
2014/11/03 职场文书
单位租房协议范本
2014/12/03 职场文书
学校实习推荐信
2015/03/27 职场文书
2016幼儿园新学期寄语
2015/12/03 职场文书