SS64.com 密码生成器是一个好方法吗?

信息安全 密码 密码策略
2021-09-02 05:02:44

ss64.com 上有两个密码生成器:

他们是如何工作的

我制作了它们的独立版本,加上原始 HTML/Javascript 版本的副本,如果你想研究它们,但这里是它们的工作原理:

本节介绍密码生成器的工作原理,以便可以推出不依赖第三方网站的独立版本。

  • 你有一个主密码,比方说 foo
  • 您为特定站点或服务生成密码,比方说 stackexchange
  • 您计算字符串的 SHA1 总和(标准版本)或 SHA256 总和(强版本)foo:stackexchange

    $ echo -n "foo:stackexchange" | sha1sum      #standard version
    b99341502484edbc43ec35a5f94be8e5de7ca53a *-
    
    $ echo -n "foo:stackexchange" | sha256sum    #strong version
    c6ac66fdb639821bcc322f186fb1214d241f35ba2a91cb660daf0a284ac19a47 *-
    
  • 您对字节序列应用 Base64 转换,其十六进制表示是先前生成的校验和:

    $ printf "\xb9\x93\x41\x50\x24\x84\xed\xbc\x43\xec\x35\xa5\xf9\x4b\xe8\xe5\xde\x7c\xa5\x3a" | base64
    uZNBUCSE7bxD7DWl+Uvo5d58pTo=
    
    $ printf "\xc6\xac\x66\xfd\xb6\x39\x82\x1b\xcc\x32\x2f\x18\x6f\xb1\x21\x4d\x24\x1f\x35\xba\x2a\x91\xcb\x66\x0d\xaf\x0a\x28\x4a\xc1\x9a\x47" | base64
    xqxm/bY5ghvMMi8Yb7EhTSQfNboqkctmDa8KKErBmkc=
    
  • (强版本)您将 + 替换为 E 和 / 替换为 a,并取前 20 个字符

  • (标准版)您取前 8 个字符,然后1a在密码末尾添加以确保至少有一个数字和一个字母

因此,使用主密码foo,并且对于特定站点stackexchange,标准生成密码是uZNBACSE1a,强生成密码是xqxmabY5ghvMMi8Yb7Eh

现在的问题

  • 强版真的比标准版强吗?如果标准版也使用 SHA256 会不会更强大?
  • 如果我选择一个好的主密钥(不是 foo,而不是 10 个以上的随机字符),我使用这些生成的密码是否相当安全?
  • 这种创建密码的方法还有哪些其他缺点?
2个回答

这里有两个级别的强度:

  • 提供的密码本身是否强大(针对暴力破解)。
  • 某人在一个站点上学习了您的一个密码是否会在其他站点上猜测您的密码(例如通过猜测“主密码”)。

“标准”版本生成 48 位熵的密码:Base64 编码是每个字符 6 位,生成器使用 8 个字符(“1a”后缀是固定的,因此它根本不会改变安全性)。48 位熵还不错,尤其是在在线攻击的情况下,攻击者每次尝试都必须与服务器对话。如果服务器被黑(通过 SQL 注入数据库转储)并且服务器没有使用正确的密码散列,一个勤奋和积极的攻击者可能会突破它;从这个意义上说,“强”版本比标准版本强一点。但是,在那种特定情况下,我会说弱点在于服务器,而不是密码(不使用正确的密码散列是这里的坏点)。

请注意,从 SHA-1 切换到 SHA-256 不会提高安全性。这还不错,但它仅在 SHA-1 不提供良好的抗原像性的情况下提供了实际收益,并且目前,SHA-1 在这方面仍然与新的一样好。

对于第二级(从站点密码升级到主密码),两个版本都很弱,因为它们太快了。给定一个特定于站点的密码,枚举潜在的主密码可以以每秒数十亿的速度完成(使用几个好的 GPU)。此外,由于转换除了站点名称之外没有加盐,如果几个人在同一个站点上对他们的密码使用相同的方法,那么他们的主密码可以并行暴力破解。“强”版本在那个级别上并不比“标准”版本强多少,除了 SHA-256 比 SHA-1 慢两倍左右,从而使攻击者的成本增加了一倍。

该方法还存在一些可用性问题:

  • 如果服务器请求用户更改他的密码,则用户无法遵守,因为该方法会为给定的主密码和站点名称生成一个密码。

  • 如果站点名称更改,则密码生成中断。

  • 某些服务器具有生成的密码不一定满足的特殊要求(例如,某些服务器要求密码必须包含至少一个标点符号——这是一种被误导的要求,但它确实发生了)。

  • 其他人指出了在第三方网站提供的页面上输入您的主密码的问题——该页面的内容可能会被更改,恕不另行通知,也没有任何明显的警告。独立版本避免了这个问题,但如果允许独立应用程序,那么这就为使用更好的系统打开了可能性。

事实上,更灵活的解决方案(例如KeePass)使用存储系统。有一种间接方式:主密码用于加密包含实际密码的包。这允许更改密码并满足其他要求。

上面提到了一些优点,但我认为值得运行一些数字来显示密码长度如何影响这一点。

一个能够进行 3500 亿次猜测/秒的 GPU 集群
350000000000 *60 *60 = 1.26e+15 次猜测/小时
或 1.10376e+19 次猜测/年

一个8位随机密码 48 位熵
2^48 = 2.8147498e+14 种可能的组合
所以破解 8 位密码的时间:
2.8147498e+14 / 1.26e+15 = 0.223 小时

具有 59 位熵10
字符随机密码 2^59 = 5.7646075e+17 可能的组合
破解 10 字符密码的时间:
5.7646075e+17 / 1.26e+15 = 457.50 小时

一个15 个字符的随机密码 89 位熵
2^89 = 6.1897002e+26 种可能的组合
破解 15 个字符密码的时间:
6.1897002e+26 / 1.10376e+19 = 56078315.93 年

20字符的随机密码,119 位熵
2^119 = 6.64614e+35 种可能的组合
破解 20 个字符密码的时间:
6.64614e+35 / 1.10376e+19 = 6.0213633e+16 年

所以这里的关键点是生成的密码和主密码都需要有足够的密码长度/熵来防御离线攻击。

编辑:只是补充一下,这些是最大时间,平均值将是这些值的一半。