-
- mysql>CREATE TABLE members (
- ->username CHAR(14) NOT NULL,
- ->password CHAR(32) NOT NULL,
- ->PRIMARY KEY(username)
- ->);
-
复制代码
然后,我们假定下面的数据已经存储在该表中:
-
- $enteredPassword.
- $salt = substr($enteredPassword, 0, 2);
- $userPswd = crypt($enteredPassword, $salt);
- // $userPswd然后就和用户名一起存储在MySQL 中
-
复制代码
我将使用Apache的口令-应答认证配置提示用户输入用户名和口令,一个鲜为人知的有关PHP的信息是,它可以把Apache 的口令-应答系统输入的用户名和口令识别为$PHP_AUTH_USER和$PHP_AUTH_PW,我将在身份验证脚本中用到这二个变量。花一些时间仔细阅读下 面的脚本,多注意一下其中的解释,以便更好地理解下面的代码:
crypt()和Apache的口令-应答验证系统的应用
-
- $host = "localhost";
- $user = "zorro";
- $pswd = "hell odolly";
- $db = "users";
- // Set authorization to False
- $authorization = 0;
- // Verify that user has entered username and password
- if (isset($PHP_AUTH_USER) &&isset($PHP_AUTH_PW)) :
- mysql_pconnect($host, $user, $pswd) or die("Can't connect to MySQL
- server!");
- mysql_select_db($db) or die("Can't select database!");
- // Perform the encryption
- $salt = substr($PHP_AUTH_PW, 0, 2);
- $encrypted_pswd = crypt($PHP_AUTH_PW, $salt);
- // Build the query
- $query = "SELECT username FROM members WHERE
- username = '$PHP_AUTH_USER' AND
- password = '$encrypted_pswd'";
- // Execute the query
- if (mysql_numrows(mysql_query($query)) == 1) :
- $authorization = 1;
- endif;
- endif;
- // confirm authorization
- if (! $authorization) :
- header('WWW-Authenticate: Basic realm="Private"');
- header('HTTP/1.0 401 Unauthorized');
- print "You are unauthorized to enter this area.";
- exit;
- else :
- print "This is the secret data!";
- endif;
- >
-
复制代码
上面就是一个核实用户访问权限的简单身份验证系统。在使用crypt()保护重要的机密资料时,记住在缺省状态下使用的 crypt()并不是最安全的,只能用在对安全性要求较低的系统中,如果需要较高的安全性能,就需要我在本篇文章的后面介绍的算法。
下面我将介绍另一个PHP支持的函数━━md5(),这一函数使用MD5散列算法,它有几种很有趣的用法值得一提:
混编
一个混编函数可以将一个可变长度的信息变换为具有固定长度被混编过的输出,也被称作“信息文摘”。这是十分有用的,因为 一个固定长度的字符串可以用来检查文件的完整性和验证数字签名以及用户身份验证。由于它适合于PHP,PHP内置的md5()混编函数将把一个可 变长度的信息转换为128位(32个字符)的信息文摘。混编的一个有趣的特点是不能通过分析混编后的信息得到原来的明码,因为混编后的结果 与原来的明码内容没有依赖关系。 即便只改变一个字符串中的一个字符,也将使得MD5混编算法计算出二个截然不同的结果。我们首先来看下 表的内容及其相应的结果:
使用md5()混编字符串
-
- $msg = "This is some message that I just wrote";
- $enc_msg = md5($msg);
- print "hash: $enc_msg ";
- >
-
复制代码
结果:
hash: 81ea092649ca32b5ba375e81d8f4972c
注意,结果的长度为32个字符。再来看一下下面的表,其中的$msg的值有了一点 微小的变化:
使用md5()对一个稍微变化的字符串进行混编
-
- //注意,message中少了一个s
- $msg = "This is some mesage that I just wrote";
- $enc_msg = md5($msg);
- print "hash2: $enc_msg
- ";
- >
-
复制代码
结果:
hash2: e86cf511bd5490d46d5cd61738c82c0c
可以 发现,尽管二个结果的长度都是32个字符,但明文中一点微小的变化使得结果发生了很大的变化,因此,混编和md5()函数是检查数据中微小变 化的一个很好的工具。
尽管crypt()和md5()各有用处,但二者在功能上都受到一定的限制。在下面的部分中,我们将介绍 二个非常有用的被称作Mcrypt和Mhash的PHP扩展,将大大拓展PHP用户在加密方面的选择。
尽管我们在上面的小节中说明了 单向加密的重要性,但有时我们可能需要在加密后,再把密码数据还原成原来的数据,幸运的是,PHP通过Mcrypt扩展库的形式提供了这种可能 性。
Mcrypt
Mcrypt 2.5.7 Unix | Win32
Mcrypt 2.4.7是一个功能强大的加密算法扩展库,它包括有22种算法 ,其中就包括下面的几种算法:
Blowfish RC2 Safer-sk64 xtea
Cast-256 RC4 Safer-sk128
DES RC4-iv Serpent
Enigma Rijndael-128 Threeway
Gost Rijndael-192 TripleDES
LOKI97 Rijndael-256 Twofish
PanamaSaferplus Wake 1 2 下一页 尾页
|