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边学边教》(01.开篇――准备工作)
Dec 13 PHP
PHP写UltraEdit插件脚本实现方法
Dec 26 PHP
PHP ? EasyUI DataGrid 资料取的方式介绍
Nov 07 PHP
php判断是否为json格式的方法
Mar 04 PHP
php提取字符串中网站url地址的方法
Dec 03 PHP
必须收藏的23个php实用代码片段
Feb 02 PHP
PHP环境搭建的详细步骤
Jun 30 PHP
PHP Ajax实现无刷新附件上传
Aug 17 PHP
PHP实现动态创建XML文档的方法
Mar 30 PHP
PHP简单实现解析xml为数组的方法
May 02 PHP
PHP bin2hex()函数基础实例讲解
Feb 11 PHP
Yii2.0框架模型添加/修改/删除数据操作示例
Jul 18 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
天津市收音机工业发展史
2021/03/04 无线电
linux下 C语言对 php 扩展
2008/12/14 PHP
PHP操作文件类的函数代码(文件和文件夹创建,复制,移动和删除)
2011/11/10 PHP
php生成静态文件的多种方法分享
2012/07/17 PHP
CodeIgniter安全相关设置汇总
2014/07/03 PHP
php生成html文件方法总结
2014/12/01 PHP
PHP中生成UUID自定义函数分享
2015/06/10 PHP
利用PHP自动生成印有用户信息的名片
2016/08/01 PHP
javascript打印html内容功能的方法示例
2013/11/28 Javascript
JavaScript判断文件上传类型的方法
2014/09/02 Javascript
jQuery实现隔行背景色变色
2014/11/24 Javascript
详谈javascript中的cookie
2015/06/03 Javascript
JavaScript添加随滚动条滚动窗体的方法
2016/02/23 Javascript
获取今天,昨天,本周,上周,本月,上月时间(实例分享)
2017/01/04 Javascript
Vue.directive()的用法和实例详解
2018/03/04 Javascript
解决bootstrap模态框数据缓存的问题方法
2018/08/10 Javascript
vue 地图可视化 maptalks 篇实例代码详解
2019/05/21 Javascript
12 种使用Vue 的最佳做法
2020/03/30 Javascript
python通过加号运算符操作列表的方法
2015/07/28 Python
python中的文件打开与关闭操作命令介绍
2018/04/26 Python
对Pandas MultiIndex(多重索引)详解
2018/11/16 Python
对python dataframe逻辑取值的方法详解
2019/01/30 Python
Pandas_cum累积计算和rolling滚动计算的用法详解
2019/07/04 Python
python各类经纬度转换的实例代码
2019/08/08 Python
Windows10下Tensorflow2.0 安装及环境配置教程(图文)
2019/11/21 Python
Flask中sqlalchemy模块的实例用法
2020/08/02 Python
python3.7.3版本和django2.2.3版本是否可以兼容
2020/09/01 Python
Nike荷兰官方网站:Nike.com (NL)
2018/04/19 全球购物
养殖项目策划书范文
2014/01/13 职场文书
《与象共舞》教学反思
2014/02/24 职场文书
汇报材料怎么写
2014/12/30 职场文书
北京青年观后感
2015/06/15 职场文书
2019年朋友圈经典励志语录50条
2019/07/05 职场文书
使用@Value值注入及配置文件组件扫描
2021/07/09 Java/Android
【DOTA2】半决赛强强对话~ PSG LGD vs EHOME - DPC 2022 CN REGIONAL FINALS WINTER
2022/04/02 DOTA
Win10鼠标轨迹怎么开 Win10显示鼠标轨迹方法
2022/04/06 数码科技