为每个站点输入唯一的密码比为每个站点提供相同的密码更安全,这正是您建议的独立妥协原因。
如果攻击者拥有哈希,并且知道它是使用 PwdHash 生成的,并且知道生成它的域,那么他们从中确定原始密码的可行性有多大?
好吧,让我们做一些调查和一些数学运算!PwdHash 似乎正在有效地使用 GoofyStuff(Base64(HMAC-MD5())),因此我们处于通常的 MD5(MD5()) 猜测游戏速度。根据oclHashcat,“PC5(8x AMD R9 290Xstock 核心时钟)”每秒可以破解约 810 亿次 MD5,因此每秒约 400 亿次尝试作为 PwdHash,这为我们提供了更实用的 1E17(略高于 2^56)每 30 次尝试天。
我快速浏览了 PwdHash 页面源代码,以此片段为基础:
var hash = b64_hmac_md5(password, realm);
这在这 30 天内的 62^9 到 62^10 的详尽键空间搜索范围内,其中 62 是大写、小写和数字(或大写、小写和数字上方的符号)的键空间,随你喜欢),长度为 9 或 10。
因此,用 HMAC-MD5 编码的完全随机的大写、小写、数字密码将在不到 30 天内找到(除非您和攻击者使用不同的字符集(即 Cryllic 与英语))。您的主密码需要总密钥空间比这更大的东西,如果它是一个真正的随机密码!
如果您的密码实际上不是完全随机的,您甚至不想考虑以这种速度进行基于规则的字典攻击会产生什么结果。我最全面的词表集是超过 40GB 的唯一密码;如果我们假设平均字长为 9 加上一个 LF 分隔符,那就是 4E9 个字,这意味着如果使用该 PC 的攻击者在您的密码上花费了 30 天,他们将能够尝试大约 2.5E7,即 2500 万种不同的变体(规则)为每个密码。
请注意,这个词表太慢而且太麻烦了……除非目标可以以疯狂的速度受到攻击,就像单个 HMAC-MD5 一样。
如果您确实将 PwdHash 与主密码一起使用,请使用非常非常好的一个 - 15 个字符或更好,加密随机,具有大字符集(大写、小写、数字、高于数字的符号、不高于数字的符号)。
其他注意事项
您应该考虑在主密码泄漏后如何更改主密码;也许你迟到了,想要快点,你直接在网站而不是 PwdHash 中输入主密码,只是出于习惯、咖啡因剥夺、匆忙和粗心。现在你需要改变它!
就个人而言,我喜欢KeePass之类的离线密码存储,但我更愿意使用基本的 OpenSSL 而不是 PwdHash——因为它实在是太可怜了,我会在一周中的任何一天将 HMAC-SHA-512 与 HMAC-MD5 放在一起。
echo example.com2014 | openssl dgst -sha512 -hmac MyPassword -binary | openssl enc -base64
与往常一样,您最好使用真正随机的东西并存储它,或者,如果您坚持使用确定性生成例程,则非常非常慢 - 特别是因为这只是为您准备的,所以 PBKDF2/BCrypt/Scrypt 有足够的迭代/work 因素在您的机器上花费一两到五秒钟就可以了,并且会减慢攻击者的速度。
无耻插件:我正在我的 Anti-weakpasswords github 页面上收集各种 PBKDF2(希望以后是 BCrypt 和 Scrypt)代码示例,其中一些可以编译,以便您可以在 Windows 或 Linux 的命令行中运行它们,并且完全按照您现在使用 PwdHash 的方式使用它们,但如果您愿意等待几秒钟,它的迭代次数几乎比任何网站都高。截至今天,只有 Mitsuhiko 编写的 Python 版本,Warner 针对高迭代次数进行了修复,尚未使用更好的哈希值进行更新,但情况会有所改善。