PwdHash 算法和系统的安全性如何?

信息安全 密码 哈希
2021-08-26 18:56:39

我几乎所有密码都使用 PwdHash 服务 ( http://crypto.stanford.edu/PwdHash/ ) 和插件。我相信这更安全,因为:

  • 没有服务获得与另一个相同的密码,因此如果一个帐户包含我的其他帐户,则不应包含。
  • 散列密码应该比我能真实记住自己的唯一密码更安全。

但是,我担心我可能会因为拥有一个主密码而使自己面临风险,如果包含该主密码,该密码可用于通过 PwdHash 访问我的所有服务。

如果攻击者拥有哈希,并且知道它是使用 PwdHash 生成的,并且知道生成它的域,那么他们从中确定原始密码的可行性有多大?

3个回答

为每个站点输入唯一的密码比为每个站点提供相同的密码更安全,这正是您建议的独立妥协原因。

如果攻击者拥有哈希,并且知道它是使用 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 针对高迭代次数进行了修复,尚未使用更好的哈希值进行更新,但情况会有所改善。

剑桥大学的 David Llewellyn-Jones 和 Graham Rymer 于 2016 年 12 月发表了一篇关于此主题的新研究论文:

论文引用:

摘要 [...] 我们演示了如何扩展 hashcat 密码恢复工具,以允许识别和恢复使用 PwdHash 生成的密码,从而揭示用户的主密码。因此,来自单个网站的泄漏可能会危及使用 PwdHash 的其他网站上的用户帐户。[...]。

结论我们想从这项工作中强调的主要内容是,PwdHash 仅与使用它的主密码一样安全。[...] 此外,我们的结果表明该消息尚未被 PwdHash 用户吸收,其中许多用户使用的是弱主密码。尽管生成的站点特定密码看起来很强大,但实际上它们并不比原始主密码强

(强调我的)

这取决于您的密码强度。使用上面的 Anti-weakpasswords 数据,15 个随机字符的密码有 62^15 = 768909704948766668552634368 个可能的密码。如果每秒尝试 400 亿次,则为 768909704948766668552634368 / 40000000000 = 19222742623719166 秒 = 609549169 年 = 6E8 年。这使用蛮力基本上是牢不可破的。

此外,密码中的字符数比密码字母大小更重要,因为密码长度是公式中的指数,字母 (72) 是基数。因此,仅使用大写/小写字符(52 个字符)给出 52^15 = 43569598 年 = 4E7 年。

我使用的设备可以为我提供 15 个字符的随机密码,并且我使用 PwdHash。我同意你的看法,这比拥有一个庞大的密码数据库要好。只要你有一个强 15 个字符的随机密码,你应该没问题。