更新后的 PHP 现代 PHP 中的密码安全性(2)
- UID
- 1066743
|
更新后的 PHP 现代 PHP 中的密码安全性(2)
改善过去的 PHP 密码实践 现在看一下清单 1,这是几年前 PHP 中有效的密码实践的一个示例。
清单 1. PHP 中通常被视为有效的密码安全做法1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| <?php
// Create a password class to handle management of this:
class Password {
const SALT = 'MyVoiceIsMyPassport';
public static function hash($password) {
return hash('sha512', self::SALT . $password);
}
public static function verify($password, $hash) {
return ($hash == self::hash($password));
}
}
// Hash the password:
$hash = Password::hash('correct horse battery staple');
// Check against an entered password (This example will fail to verify)
if (Password::verify('Tr0ub4dor&3', $hash)) {
echo 'Correct Password!\n';
} else {
echo "Incorrect login attempt!\n";
}
|
像清单 1 这样的示例在 Web 中被视为所谓的最佳实践。长时间以来,此方法曾是 最佳实践 — 显然比使用 MD5 更好,而且比将密码存储为明文要好得多。清单 1 使用了复杂得多的 SHA-512 算法,而且它强制所有密码都添加上了 SALT,以战胜预先制定的彩虹表。但此方法仍然存在一些问题。
采用随机 SALT 使用了一个 SALT,但每个密码都使用完全相同的 SALT。所以,一旦有人破解了一个密码(或者更糟地,通过访问代码库而发现了 SALT),那么他就可以通过向每个采用表条目添加该 SALT来创建自定义的彩虹表。战胜彩虹表的解决方案是,在创建密码时为每个密码使用一个随机 SALT,将 SALT和密码一起存储,以便可获取密码。
进一步增加成本 也使用了 SHA-512(PHP 随带的一种复杂得多的算法),而没有使用 MD5 或 SHA-1。但是,甚至 SHA-512 哈希值也可以每秒 4600 万次计算的速率破解。尽管比 MD5 或 SHA1 破解速率更慢一些,但此速率对足够的安全性而言仍是不够的。此问题的解决方案是,使用在计算上更复杂的算法,而且多次使用这些算法。例如,为每个密码连续运行 SHA-512 100 次,这会显著减缓任何攻击尝试。
好消息是,您不需要尝试使用自己的代码实现此解决方案。PHP 5.5 中新的密码哈希计算库解决了这一问题。 |
|
|
|
|
|