为了进一步提高安全性,您可以使用 md5 加密以及两个不同的盐字符串,一个在 php 文件中定义的静态盐,然后为每个密码记录再随机生成一个唯一盐。
以下是生成盐、md5 字符串和存储的方法:
$unique_salt_string = hash('md5', microtime());
$password = hash('md5', $_POST['password'].'static_salt'.$unique_salt_string);
$query = "INSERT INTO users (username,password,salt) VALUES('bob','".$password."', '".$unique_salt_string."');
现在您有了一个静态盐,它对您的所有密码都有效,它存储在 .php 文件中。然后,在注册执行时,您会为该特定密码生成一个唯一的哈希。
这一切都结束了:两个拼写完全相同的密码,将有两个不同的哈希值。唯一的哈希值与当前 ID 一起存储在数据库中。如果有人抓取数据库,他们将拥有每个特定密码的每个唯一盐。但他们没有的是你的静态盐,这让每个“黑客”的事情变得更加困难。
这是您在 login.php 上检查密码有效性的方法,例如:
$user = //username input;
$db_query = mysql_query("SELECT salt FROM users WHERE username='$user'");
while($salt = mysql_fetch_array($db_query)) {
$password = hash('md5',$_POST['userpassword'].'static_salt'.$salt[salt]);
}
此方法非常强大且安全。如果要使用 sha512 加密,只需将其放在哈希函数中,而不是上面代码中的 md5。