在开发PHP应用中如果不想自己开发新的加密算法,还可以利用PHP提供的crypt()函数来完成单向加密功能。
了解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()支持四种加密算法
\n
算法 | 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节所介绍的一致。
\n
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 ?>\n
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 ?>\n