【问题标题】:Confused about salting (Cryptography)? [closed]对加盐(密码学)感到困惑? [关闭]
【发布时间】:2011-11-27 06:36:50
【问题描述】:

我是这方面的新手,所以这个问题很可能很容易。我只是不太了解加盐。

不加盐和使用 sha1,您可以将密码散列为 sha1('password') 并验证用户,您只需比较 sha1_stored ==? sha1(user_input)。

使用 salting 和 sha1 将密码散列为 sha1('password' + salt),但我不确定如何验证它。

根据我的阅读,盐总是随机的。因此,如果您使用 sha1('password' + random_salt1),是否必须将 random_salt 存储在某处,因为当您验证 sha1('password' + random_salt1) == 时? sha1(user_input + random_salt2),你不能保证random_salt1 == random_salt2。还是 salt 像 site_key(一个随机的 salt,但整个站点只存储一个)?我知道盐如何提高安全性,但我不确定如何正确实现它,以便我可以验证我存储的内容(也不知道这一点)。那么有人可以向我解释一下,并可能给我一个加盐和验证字符串的例子吗?

【问题讨论】:

标签: security cryptography passwords sha1 salt


【解决方案1】:

是的,您必须将随机盐存储在某个地方。

不,你不应该让整个网站都一样,因为它完全违背了加盐的目的。

加盐的目的是提高整个密码列表的安全性。如果您不加盐,并且您的数据库遭到破坏,攻击者就会获取您的所有帐户和密码。如果它们没有加盐,攻击者只需 sha1 的一堆单词并将 所有的所有的 sha1 密码 进行比较。其中一些会匹配一些密码,并且一些帐户被盗用了。

使用加盐,攻击者必须独立地操作每个密码,从整个字典开始,加盐,散列,然后将它们与加盐、散列的密码进行比较。你可以看到这样效率会低很多,因为攻击者每次都必须更换盐。通过这种方式,从受感染的数据库中获取密码要困难得多。

存储盐的一种常用方法是将其附加或预先添加到散列中并将其存储在数据库中。由于 salt 和 hash 的长度是已知的,因此很容易将它们单独提取出来。

【讨论】:

    【解决方案2】:

    盐是随机选择的,每个字符串都不同,但这不是秘密。因此,您将盐与哈希一起存储:salt + hash。验证检查 hash(salt + password) 是否等于存储的哈希。

    使用盐的主要目的是确保两个相同的密码不会散列到同一个东西,同时也使对散列密码的攻击更加困难。如果没有盐,您只需一劳永逸地破解给定的哈希值,以识别所有哈希到它的密码。使用盐,您基本上必须重新攻击每个哈希。

    请注意,在现代廉价并行计算硬件(GPU 和云)中,单个加盐哈希不再那么安全,因为它可能会在可行的时间内通过蛮力发现。因此,当前的建议是对密码进行多次散列(例如 1000 轮左右)以使计算变得昂贵。当提供正确的密码时,额外的时间无关紧要,但如果你尝试暴力破解,那么增加 1000 倍是一个很大的威慑力。

    【讨论】:

    • 所以你通过以下方式存储盐: store(salt + hash(password + salt)) 然后修剪第一个/前盐以用于验证用户输入的密码?
    • 当你说 1000 次时,你是指哈希还是哈希和盐?
    • 如果您的意思是哈希和盐,您将如何检查密码的正确性,因为您无法获得第二次迭代的盐?
    • @Derek:您每次都使用相同的盐。 salt 的目的是为不同的用户将相同的密码散列到不同的散列。散列 1000 次的目的是让暴力破解散列变慢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    • 2016-09-04
    • 2012-05-03
    • 1970-01-01
    相关资源
    最近更新 更多