PHP中使用crypt()实现用户身份验证的代码

所属分类: 网络编程 / PHP编程 阅读数: 1224
收藏 0 赞 0 分享
了解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中使用crypt()实现用户身份验证的代码

在开发PHP应用中如果不想自己开发新的加密算法,还可以利用PHP提供的crypt()函数来完成单向加密功能
收藏 0 赞 0 分享

PHP输出数组中重名的元素的几种处理方法

PHP输出数组中重名的元素的几种处理方法,需要的朋友可以参考下
收藏 0 赞 0 分享

PHP curl 并发最佳实践代码分享

在实际项目或者自己编写小工具(比如新闻聚合,商品价格监控,比价)的过程中, 通常需要从第3方网站或者API接口获取数据, 在需要处理1个URL队列时, 为了提高性能, 可以采用cURL提供的curl_multi_*族函数实现简单的并发
收藏 0 赞 0 分享

用来解析.htgroup文件的PHP类

用来解析.htgroup文件的PHP类代码,需要的朋友可以参考下
收藏 0 赞 0 分享

用来解析.htpasswd文件的PHP类

有时候需要获取.htpasswd文件的内容,那么就可以用下面的代码类了,需要的朋友可以参考下
收藏 0 赞 0 分享

PHP imagecreatefrombmp 从BMP文件或URL新建一图像

大家都知道php GD库可方便的从URL新建一图像, GD中有imagecreatefromjpeg(),imagecreatefromPNG()....等
收藏 0 赞 0 分享

php生成静态文件的多种方法分享

最近需要将自己写的php文件生成静态,经过查找,发现有多种方法,不同需求可以选择不同的方法
收藏 0 赞 0 分享

采集邮箱的php代码(抓取网页中的邮箱地址)

由于搞了个群发邮件的程序,当然没邮箱不行,所以写了个采集邮箱程序
收藏 0 赞 0 分享

一个简单的网页密码登陆php代码

密码对,就可以看到指定内容, 密码不对就进不去
收藏 0 赞 0 分享

UCenter 批量添加用户的php代码

有时候我们需要批量添加用户,只要把该php放进UCenter目录下,执行就可以了。
收藏 0 赞 0 分享
查看更多