首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

更新后的 PHP 现代 PHP 中的密码安全性(2)

更新后的 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 中新的密码哈希计算库解决了这一问题。
返回列表