t0306894
|
分享:
x0
|
[PHP][教学] PHP的数据加密
PHP提供了crypt()函数完成加密功能: string crypt (string input_string [, string salt])
这一函数完成被称作单向加密的功能,也就是说,它可以加密一些明码,但不能够将密码转换为原来的明码。单向加密的口令一旦落入第三方人的手里,由于不能被还原为明文,因此也没有什么大用处。在验证用户输入的口令时,用户的输入采用的也是单向演算法,如果输入与存储的经加密后的口令相匹配,则输入的口令一定是正确的。
这个函数的input_string参数是需要加密的字串,第二个参数salt是一个位字串,它能够影响加密的暗码,进一步地排除被称作预计算攻击的可能性。缺省情况下,PHP使用一个2个字元的DES干扰串,如果你的系统使用的是MD5 ,它会使用一个12个字元的干扰串。我们可以通过执行下面的命令发现系统将要使用的干扰串的长度:
print "系统使用的干扰串的长度是:". CRYPT_SALT_LENGTH;
crypt()支援四种演算法,下面是它支援的演算法和相应的salt参数的长度: [注:以下用表格] 演算法 Salt长度 CRYPT_STD_DES 2-character (默认) CRYPT_EXT_DES 9-character CRYPT_MD5 12-character beginning with $1$ CRYPT_BLOWFISH 16-character beginning with $2$
怎样将PHP的资料加密功能应用于用户验证?
我们用crypt()实现用户身份验证。比如我们用一段PHP程式限制对一个目录的访问,只允许注册用户访问这一目录。我们把资料存储MySQL资料库的一个表(这个资料表名为members)中: mysql>CREATE TABLE members ( ->username CHAR(14) NOT NULL, ->password CHAR(32) NOT NULL, ->PRIMARY KEY(username) ->);
然后,我们可以输入用户的资料到该表中: 用户名 密码
Tom keloD1C377lKE John ba1T7vnz9AWgk Bill paLUvRWsRLZ4U
这些加密的口令对应的明码分别是Tom、John和Bill。我们将根据口令的前二个字母创建干扰串: $enteredPassword. $salt = substr($enteredPassword, 0, 2); $userPswd = crypt($enteredPassword, $salt);
// $userPswd然后就和用户名一起存储在MySQL 中
crypt()和Apache的口令-应答验证系统的应用 <?php $host = "localhost"; //主机 $username = "Tom"; //用户名 $passwd = "Hello world"; //密码 $db = "users"; //资料库名
// 设置是否通过验证标志,默认为否 $authorization = 0;
// 提示用户输入帐号和密码
if (isset($PHP_AUTH_USER) && isset($PHP_AUTH_PW)){ mysql_pconnect($host, $username, $passwd) or die("不能连接到MySQL服务器!"; mysql_select_db($db) or die("不能选择资料库!";
// 进行加密 $salt = substr($PHP_AUTH_PW, 0, 2); $encrypted_pswd = crypt($PHP_AUTH_PW, $salt);
//SQL查询语句 $query = "SELECT username FROM members WHERE username = '$PHP_AUTH_USER' AND password = '$encrypted_pswd'";
// 执行查询 if (mysql_numrows(mysql_query($query)) == 1) { $authorization = 1; } }
if (! $authorization){ header(WWW-Authenticate: Basic realm="用户验证"'); header('HTTP/1.0 401 Unauthorized'); print "无法通过验证"; exit; }else { print "已经加密"; } ?>
在缺省状态下使用的 crypt()并不是最安全的,所以如果需要较高的安全性能,就需要其他更好的演算法,比如md5(),这一函数使用MD5散列演算法。
如何通过MD5方式进行加密?
PHP中通过MD5方式加密的函数有md5(),它的一个作用是混编。
一个混编函数可以将一个可变长度的资讯变换为具有固定长度被混编过的输出,也被称作"资讯文摘",这是十分有用的,因为 一个固定长度的字串可以用来检查档的完整性和验证数位签名与用户身份。PHP内置的md5()混编函数将把一个可变长度的资讯转换为128位元(32个字元)的资讯文摘。混编的一个有趣的特点是:不能通过分析混编后的资讯得到原来的明码,因为混编后的结果 与原来的明码内容没有依赖关系。即便只改变一个字串中的一个字元,也将使得MD5混编演算法计算出二个截然不同的结果。我们首先来看下表的内容及其相应的结果:
使用md5()混编字串 <php $input = "Hello,PHP world!"; $output = md5($input); print "输出: $output "; ?>
结果:
输出: 7996b5e0804042fd531907a4900f190e
注意,结果的长度为32个字元。我们把$input的值稍微改变一下:
使用md5()对一个稍微变化的字串进行混编 <?php $input = "Hello,PHP World!"; $output = md5($input); print "输出: $output "; ?>
结果:
hash2: f0456d48ed06a5c35b1e42561fa7a016 可以发现,尽管二个结果的长度都是32个字元,但明文中一点微小的变化使得结果发生了很大的变化,我们可以利用这个特点来检查资料中微小变化。
|