【问题标题】:How To Secure Encrypted Password Even The Weakest One?如何保护加密密码,即使是最弱的密码?
【发布时间】:2011-07-05 05:51:24
【问题描述】:

我一直在寻找保护用户密码的方法。我目前正在使用散列算法与随机盐的某种组合。

这个问题的主要问题是当我的用户设置了一个非常非常弱的密码时。不管我的混合哈希算法有多难,我的盐有多长,我认为它可以在不到 1 年的时间内破解。

我一直在想一种新的方法。我制作了一个脚本,每次用户注销时都会重新加密密码,方法是在旧的散列密码上添加随机盐,然后再次加密。所以,每次用户回来,加密的密码都是不同的。明白了吗?

但是这个想法的主要问题是,每次用户退出时我都必须存储新的盐。想象一下,如果用户每天登录和退出,我的代码会是什么样子?

有什么想法吗?

哦,我有个主意。每年重新生成一个新的加密密码怎么样?

【问题讨论】:

  • 只需使用很长的盐,或者开始对人们的密码执行标准。

标签: encryption passwords md5 sha256 sha512


【解决方案1】:

重新加密对您的问题没有帮助。

你唯一能做的就是创建一个多部分哈希,并希望攻击者没有得到所有这些。我通常使用两份盐:

其中一部分是与密码一起存储在数据库中的每个用户的随机值。

另一部分是每个应用程序的盐。您可以将其存储在应用程序配置中或操作系统提供的特殊密码存储中。

这种拆分的优势在于,攻击者仅获得对数据库的访问权限是不够的,但他需要获得对存储应用程序盐的任何位置的访问权限。因此,例如一个简单的 sql 注入窃取您的数据库是不够的。如果攻击者可以执行代码,它可能根本无济于事。


你应该使用一些方法来减慢散列。典型的哈希函数很快,所以蛮力也很快。但是,如果您将哈希函数迭代一百万次,它仍然不会大大降低有效登录的速度,但会大大降低暴力破解速度。

您可以使用Password Based Key Derivation Function(例如 PBKDF2)来实现。

【讨论】:

  • 我明白了。所以这个想法是尽可能降低蛮力的速度?我会试试这个。
  • 第二部分的思路就是这样。但是,您当然会以同样的因素减慢合法登录的速度。因此,这是登录的计算成本和减缓攻击者速度之间的权衡。根据用户数量,一个好的折衷方案可能是服务器应用程序大约 10 毫秒,磁盘加密大约 1 秒。
【解决方案2】:

您可以使用“密钥拉伸”:在加盐之后迭代哈希,例如一百万次。 然后存储哈希值、盐和迭代计数。 然后,攻击者每秒检查的密码比你散列一次时少一百万倍。但是一个很短的密码还是会掉:注意你自己,要验证合法密码,需要做同样的操作。假设您接受 1 秒的时间让自己检查,那么攻击者也可以在类似的机器上以每个密码 1 秒的速度检查密码(如果他使用更多或更快的机器,则更多!)。并且每个密码 1 秒仍然足以检查弱密码和短密码、标准字典等。确实没有防御它,只会让它变得更难。

【讨论】:

    【解决方案3】:

    您的主要假设存在两个问题。第一个是关于储存盐的问题。您已经为加盐密码解决方案做了。使用您的新方法,盐会随着时间而改变,仅此而已。所以你可以使用这种方法,唯一的额外成本是在每次登录时重新计算哈希值(当你实际上有密码字符串本身时)。

    第二个问题更重要:重新散列不会改变任何事情。一旦您的攻击者获得一个加盐哈希值,就足以发起字典攻击。您更改数据库中的盐和哈希的事实不会使其变得更加困难。因此,在创建第一个哈希后无需重新计算哈希。

    【讨论】:

    • 是的。但这会更难(我猜)因为字符串更长。前
    • 我不明白为什么会这样。密码相同,salt 由 S1 变为 S2。原来的 S1、H1 值仍然有效,但您现在将 S2、H2 存储在 DB 中。什么字符串变长了?
    • 我明白了。那么,你有什么想法吗?
    • @dimassony 对于弱密码,您无能为力。无论您的底层机制是什么,它们都容易受到字典攻击。 CodeInChaos 的答案有一些增加攻击时间的好方法。
    猜你喜欢
    • 1970-01-01
    • 2011-02-01
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-10
    • 2012-08-11
    相关资源
    最近更新 更多