我正在学习网络安全。我知道密码是用盐散列的。为什么不使用相同用户的密码加密盐?Cloudn 这不是让密码破解变得更加困难吗?
生成
- 生成盐
- 使用用户的密码作为密钥,使用 AES 对其进行加密
- 保存加密的盐和哈希
检索
- 使用提供的密码解密盐
- 哈希盐+密码
- 与保存的哈希比较
我正在学习网络安全。我知道密码是用盐散列的。为什么不使用相同用户的密码加密盐?Cloudn 这不是让密码破解变得更加困难吗?
生成
检索
生成盐使用 AES 加密它使用用户的密码作为密钥保存加密的盐和哈希
你可以这样做,这将是一种有效的盐,但它实际上不会比只使用普通盐更安全。
让我们考虑两个攻击向量:
显然,我们不希望使用相同密码的两个用户拥有相同的哈希密码。为了防止这种情况,我们使用随机盐,并假设两个用户使用相同密码和相同随机生成的盐的概率实际上为 0。
但是,如果两个用户碰巧有相同的密码并且巧合地使用相同的盐,那么无论盐是用他们的密码加密还是根本没有加密,他们都会有相同的哈希值。因此,通过加密 salt 并不会降低 salt 中发生冲突的可能性。唯一使它不太可能的因素是用于盐的随机值的质量和位数。
如果攻击者正在尝试蛮力攻击并且您已经加密了盐,他们唯一需要做的额外步骤是每次迭代解密存储的盐并使用它来产生哈希,然后将其与哈希密码进行比较以查看他们是否有一场比赛。
这确实需要攻击者付出更多的努力,但是当涉及到密码学时,只需要花费两到三倍的时间并不重要。如果现在暴力破解密码需要 3 天而不是 2 天,那么您并没有真正让它变得更加安全。如果你试图让某件事情变得安全,你希望它需要 5000 年而不是 2 天。
如果你想减缓蛮力攻击,你最好迭代你的散列过程数万次,或者使用专门设计为计算速度慢的散列函数。
正如 thexacre 所说,它不会妨碍暴力破解方法,因为猜测可以用来解密散列。
但是,如果在使用的哈希中发现(即未来发现)系统漏洞,那么加密的盐可能被证明是有价值的。但是,根据攻击的性质,可能会像单独导出密码一样容易地导出盐和密码。