盐值加密密码哈希的优势是什么?

4
我刚刚阅读了许多SO上关于使用盐值哈希密码的文章,但我仍然无法找到对我特别疑问/困惑的答案。
假设我刚刚执行了以下方法以将密码和盐值添加到数据库中:
- 创建一个随机生成的盐值 - 将用户的密码和盐值一起进行哈希计算 - 将哈希输出存储为“password”列中的密码 - 将随机生成的盐值存储在“salt”列中
如果这是正确的,那么当攻击者获得我的数据库访问权限时会发生什么?如果他们可以读取该哈希密码的盐值,在没有盐值的情况下,他们能否计算出哈希密码并使用彩虹表?或者对盐值进行加密,并使用可逆的方式来保护它是否是个好主意?
如果盐值以明文形式存储,我就看不出它有任何意义。请给我指点迷津。
4个回答

6
如果攻击者能够接触到数据库,那么一切都无法保证,但是就盐的作用而言...... 盐的作用并非保密,而是为了防止彩虹攻击——彩虹攻击是通过彩虹表进行的。 而彩虹表只是数百万个密码的预生成哈希值(这是空间和时间的权衡)。 引入盐使这些预计算的哈希无效:必须为每个唯一的盐制作彩虹表。 因此...
1. 使盐随机,并且; 2. 使盐足够大
现在,如果假设攻击者已经拥有了数据库,那么就会出现另一个问题:攻击速度不受限制,这就是为什么像bcrypt或多重轮的密码哈希方案很有价值的原因。它可以将攻击速度从每秒数亿次哈希(MD/SHA等算法被设计成快速)减缓到每秒几百次(在相同硬件上)......还要考虑使用HMAC方法,该方法还包含了服务器秘密(使其有效地成为密码+盐+秘密)。
(我只会使用已经解决了所有这些问题以及更多问题的现有系统:-)
祝编码愉快。

因为提到了迭代、盐值以及指向bcrypt,所以它被修改并上升了。 - Maarten Bodewes

5
您列出的步骤是正确的。
如果攻击者访问了您的数据库,他必须对可能的密码和随机盐进行暴力搜索。如果您使用一个64位合理随机的盐,那么不会有两个使用相同盐的条目,因此任何彩虹表攻击一次只能针对(最多)一个盐值,这使得彩虹表攻击变得太昂贵,不值得。 (您甚至可以在为用户分配盐时检查是否存在使用给定盐的其他密码。)
盐值哈希密码过程的重点在于使预计算可能的密码哈希变得计算上不可行,因为随机盐破坏了预计算过程。
这也意味着,如果在不同的站点使用相同的密码,则仅通过查看(加盐哈希)密码值就不会很明显 - 因为不同站点的盐将不同,因此生成的哈希值将不同。 (当然,如果发现了一个站点的密码,那么攻击者将首先在下一个站点尝试该密码;最好不要在多个位置使用相同的密码。但使用相同密码的事实是隐藏的。)

3
假设您没有使用盐并且攻击者获得了您的哈希值。她只需要将哈希值与查找表进行比较,看看其中是否有已知密码的哈希值。假设该表中有一百万个密码,她可以非常有效地检查所有哈希值以匹配可能的密码。
现在假设相同的攻击者获得了您的哈希值,但它们是经过盐处理的。对于她想要检查的每个哈希值,她都需要取候选密码,应用盐,计算新的哈希值,并将其与您存储的哈希值进行比较。现在她需要进行大量计算,效率不高。(或者,她可以拥有一个包含每个可能盐的查找表,但是需要比没有盐的表大得多。)
这一切都是为了使破解哈希值所需的资源超过攻击者的价值。

0
诚信的价值最重要,因为运营流程的重要性不允许任何破坏。p12证书验证了交易,并显示它是一个发生了的交易,而数据通过块头信息显示了诚信的来源。

如果你在引用某些内容,那么你应该标明出处;如果不是的话,为什么要将段落以块引用的格式呈现呢? - undefined
https://stackoverflow.com italic www. code - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接