当前位置: 首页 > 图文教程 > 网络编程 > PHP > PHP中使用crypt()实现用户身份验证

PHP
php 服务器调试 Zend Debugger 的安装教程
从Web查询数据库之PHP与MySQL篇
php 应用程序安全防范技术研究
php 不同编码下的字符串长度区分
php 生成饼图 三维饼图
PHP 字符截取 解决中文的截取问题,不用mb系列
PHP5 操作MySQL数据库基础代码
php面向对象全攻略 (一) 面向对象基础知识
php面向对象全攻略 (二) 实例化对象 使用对象成员
php面向对象全攻略 (三)特殊的引用“$this”的使用
php面向对象全攻略 (四)构造方法与析构方法
php面向对象全攻略 (五) 封装性
php面向对象全攻略 (六)__set() __get() __isset() __unset()的用法
php面向对象全攻略 (七) 继承性
php面向对象全攻略 (八)重载新的方法
php面向对象全攻略 (九)访问类型
php面向对象全攻略 (十) final static const关键字的使用
php面向对象全攻略 (十一)__toString()用法 克隆对象 __call处理调用错误
php面向对象全攻略 (十二) 抽象方法和抽象类
php面向对象全攻略 (十四) php5接口技术

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 145 ::
收藏到网摘: n/a

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

了解crypt()

只要有一点使用非Windows平台经验的读者都可能对crypt()相当熟悉,这一函数完成被称作单向加密的功能,它可以加密一些明码,但不能反过来将密码重新转换为原来的明码。crypt()函数定义如下。

stringcrypt(stringinput_string[,stringsalt])

其中,input_string参数是需要加密的明文字符串,第二个可选的salt是一个位字串,能够影响加密的暗码,进一步排除被破解的可能性。缺省情况下,PHP使用一个2个字符的DES干扰串,如果系统使用的是MD5(参考下一节内容),PHP则会使用一个12个字符的干扰串。可以通过执行下面的命令发现系统将要使用的干扰串的长度。

print"Mysystemsaltsizeis:".CRYPT_SALT_LENGTH;

crypt()支持4种加密算法,表19.1显示了其支持的算法和相应的salt参数的长度。

表crypt()支持四种加密算法

    算法     Salt长度     CRYPT_STD_DES     2-character(Default)     CRYPT_EXT_DES     9-character     CRYPT_MD5     12-characterbeginningwith$1$     CRYPT_BLOWFISH     16-characterbeginningwith$2$
从表面上看,crypt()的函数似乎没有什么用处,但该函数的确被广泛用来保证系统密码的完整性。因为,单向加密的口令即使落入第三方的手里,由于不能被还原为明文,也没有什么大用处。

用crypt()实现用户身份验证

上一部分简单介绍了crypt()函数的功能,下面利用其来实现用户的身份验证,其所要实现的目标同19.2.3节所介绍的一致。

    1<!--check_user_crypt.php:使用crypt()函数验证用户---------------->
2<?php
3$user_name=$_POST["user_name"];
4require_once("sys_conf.inc");//系统配置文件,包含数据库配置信息
5
6//连接数据库
7$link_id=mysql_connect($DBHOST,$DBUSER,$DBPWD);
8mysql_select_db($DBNAME);//选择数据库my_chat
9
10//查询是否存在登录用户信息
11$str="selectname,passwordfromuserwherename='$user_name'";
12$result=mysql_query($str,$link_id);//执行查询
13@$rows=mysql_num_rows($result);//取得查询结果的记录笔数
14$user_name=$_SESSION["user_name"];
15$password=$_POST["password"];
16$salt=substr($password,0,2);
17$password_en=crypt($password,$salt);//使用crypt()对用户密码进行加密
18
19//对于老用户
20if($rows!=0)
21{
22list($name,$pwd)=mysql_fetch_row($result);
23
24//如果密码输入正确
25if($pwd==$password_en)
26{
27$str="updateusersetis_online=1wherename='$user_name'andpassword='$password_en'";
28$result=mysql_query($str,$link_id);//执行查询
29require("main.php");//转到聊天页面
30}
31//密码输入错误
32else
33{
34require("relogin.php");
35}
36
37}
38//对于新用户,将其信息写入数据库
39else
40{
41$str="insertintouser(name,password,is_online)values('$user_name','$password_en',1)";
42$result=mysql_query($str,$link_id);//执行查询
43require("main.php");//转到聊天页面
44}
45//关闭数据库
46mysql_close($link_id);
47?>
示例与上一节所介绍的使用XOR加密算法来保护用户信息非常类似,其核心部分在于第16、17行使用crypt()函数获取加密后的密码,而通过在第25行比较数据库中的密码和加密后的密码是否相等来检查用户是否合法。

下面,通过一个实例来看一下加密后的密码会变成什么样子。

例如,用户名为rock,密码为123456,则加密后的密码为:

12tir.zIbWQ3c

上面就实现了一个简单的用户身份验证系统。在使用crypt()保护重要的机密信息时,需要注意的是,在缺省状态下使用crypt()并不是最安全的,只能用在对安全性要求较低的系统中。