我建议使用 PHPass 库来保护您的密码,因为 md5 和 shai 以及其他加密算法并不安全。
PHPass 负责
- 加密。
- 盐。
- 拉伸。
而且那个方法还没有被破解(暴力破解不能算PHPass的破解)。
你可以从这里得到它:http ://www.openwall.com/phpass/
一旦你设置了代码,它就很容易散列:
$hash = PasswordHash($iteration_count_log2, $portable_hashes)
然后您可以从数据库中获取存储的哈希,并通过函数将登录密码哈希与现有哈希匹配
$auth = CheckPassword($incomingPasswordNotHashed, $hashFromDatabase);
我喜欢通过做这样的事情来做一个哈希来使它更简单:
// Usage: $hash = PHPhass($password);
// Pre: $password is of type string,
// indicating the password which
// the user want's to hash.
// Post: $hash is the hashed password.
function PHPhass($password)
{
$unHashed = $password;
require '../phpass/PasswordHash.php';
header('Content-type: text/plain');
$t_hasher = new PasswordHash(12, FALSE); // Define the iterations once.
$hash = $t_hasher->HashPassword($unHashed);
unset($t_hasher);
return $hash;
}
并这样做以匹配哈希和非哈希密码:
// Usage: $check = PHPhassMatch($password, $hash)
// Pre: $password is of type string,
// indicating a user's passwordd
// $hash is a hashed password.
// Post: $check is true if $password's hash
// value is equal to $hash.
function PHPhassMatch($password, $hash)
{
$unHashed = $password;
$theHashed = $hash;
require '../phpass/PasswordHash.php';
header('Content-type: text/plain');
$t_hasher = new PasswordHash(8, FALSE);
$check = $t_hasher->CheckPassword($unHashed, $theHashed);
unset($t_hasher);
return $check;
}
此外,就像 Fresh 提到的:
- 不要使用 mysql_*,因为它已被弃用,我建议使用 PDO 或 mysqli。
- 使用准备好的语句来防止 sql 注入。
- 不要假设已发布的变量已发布,请使用 isset() 检查它们是否存在
您提到了shai1,您确定数据库中的密码不是sha1,而是与md5匹配吗?