PHP中使用crypt()实现用户身份验证
2008-02-23 06:28:20来源:互联网 阅读 ()
了解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节所介绍的一致。
1 <!--check_user_crypt.php:使用crypt() 函数验证用户----------------> 2 <?php 3 $user_name=$_POST["user_name"]; 4 require_once("sys_conf.inc"); //系统配置文件,包含数据库配置信息 5 6 //连接数据库 7 $link_id=mysql_connect($DBHOST,$DBUSER,$DBPWD); 8 mysql_select_db($DBNAME); //选择数据库my_chat 9 10 //查询是否存在登录用户信息 11 $str="select name,password from user where name ='$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 //对于老用户 20 if($rows!=0) 21 { 22 list($name,$pwd)=mysql_fetch_row($result); 23 24 //如果密码输入正确 25 if($pwd==$password_en) 26 { 27 $str="update user set is_online =1 where name ='$user_name' and password='$password_en'"; 28 $result=mysql_query($str, $link_id);//执行查询 29 require("main.php"); //转到聊天页面 30 } 31 //密码输入错误 32 else 33 { 34 require("relogin.php"); 35 } 36 37 } 38 //对于新用户,将其信息写入数据库 39 else 40 { 41 $str="insert into user (name,password,is_online) values('$user_ name','$password_en',1)"; 42 $result=mysql_query($str, $link_id); //执行查询 43 require("main.php"); //转到聊天页面 44 } 45 //关闭数据库 46 mysql_close($link_id); 47 ?> |
示例与上一节所介绍的使用XOR加密算法来保护用户信息非常类似,其核心部分在于第16、17行使用crypt()函数获取加密后的密码,而通过在第25行比较数据库中的密码和加密后的密码是否相等来检查用户是否合法。
下面,通过一个实例来看一下加密后的密码会变成什么样子。
例如,用户名为rock,密码为123456,则加密后的密码为:
12tir.zIbWQ3c
上面就实现了一个简单的用户身份验证系统。在使用crypt()保护重要的机密信息时,需要注意的是,在缺省状态下使用crypt()并不是最安全的,只能用在对安全性要求较低的系统中。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:UTF8下的中文PHP编程
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash