|
<?php $user = strip_tags(substr($_POST['user'],0,32)); $pw = strip_tags(substr($_POST['password'],0,32)); $cleanpw = crypt(md5($pw),md5($user));
$sql = "select user,password from users where user='". mysql_real_escape_string($user)."' and password='". mysql_real_escape_string($cleanpw)."' limit 1'; $result = mysql_query($sql);
if (mysql_num_rows($result)){ //we have a match! }else{ //no match } ?> 例如,如果存储的加密密码是 i83Uw28jKzBrZF,则加密存储传入的密码,并将它与存储的密码进行比较。攻击者破坏加密的惟一方法是将一个非常长的字符串列表与您的加密密码进行比较,每次比较一个,直到找到匹配项。这也称为字典攻击,因此您的密码最好不应该是密码 或 Star Trek 字符名,甚至您的呢称。因为在加密 Fido 后,它会变成一堆乱语,但这并不表明它对于此种攻击是安全的。确保您的密码具有某一长度(八个或更多字符),并包含大写字母、数字和特定的字符,如 ! 和 $,这样猜测您的数据会更加困难。在短语中,f1D0! 是一个较好的密码,它胜于 GandalftheGray 之类的长密码,由于后者使用小写字母,并且是 “Lord of the Rings” 的字符名称。
使用 crypt() 的一种不太好的方法
还有使用 crypt() 的另一种方法,这种方法不太好:将明文的前 n 个字符用作 salt。
清单 7. 将明文字符用于 salt
<?php $user = strip_tags(substr($_POST['user'],0,32)); $pw = strip_tags(substr($_POST['password'],0,32)); $cleanpw =crypt($pw, substr($user,0,2));
$sql = "select user,password from users where user='". mysql_real_escape_string($user)."' and password='". mysql_real_escape_string($cleanpw)."' limit 1'; $result = mysql_query($sql);
if (mysql_num_rows($result)){ //we have a match! }else{ //no match } ?>
如果您的用户名是 tmyer,则 salt 预置为 tm,它会使某人很容易推断 salt 的内容。这不是一个好方法。
使用 PHP 进行加密和解密
本文的大部分篇幅讨论了使用 crypt() 的单向加密。但是,如果您要将消息发送给某人,并提供对该消息解密的方法,又该如何办呢?请使用 PHP 支持的公钥加密技术。
使用公钥加密的用户拥有一个私钥和一个公钥,并且他们与其他用户共享公钥。如果您要将一封私有短信发送给您的朋友 John Doe,您可以使用 John Doe 的公钥(您已经将其存储在自已的 keyring 中)加密该消息。John Doe 收到该消息后,只有他可以使用他的私钥对其解密。任何给定用户的公钥和私钥在数学上是不能相关的。对于 P 上一页 [1] [2] [3] [4] [5] [6] 下一页 |