密码散列中盐的复杂性重要吗?

信息安全 密码 哈希
2021-08-15 14:01:38

我没有任何网络安全知识,并且正在尝试将密码安全地存储在数据库中。我知道我需要使用盐,以避免彩虹表攻击并确保使用相同密码的两个用户将具有不同的密码哈希。

然而,盐的复杂性重要吗?我打算简单地使用用户的 id(每次创建新帐户时递增的整数),但这是否足够好,或者我应该生成更复杂的盐?

3个回答

重要的部分

您自己生成盐的事实是一个危险信号。最好的方法是使用已建立的库进行密码散列,特别是如果您对安全性经验很少的话。

精心设计的库会自动为您生成和使用盐,并将盐和哈希存储在同一个字符串中,您将其放在数据库的一列中。

因此,使用为密码散列设计的慢速算法,并使用已建立的库,您就不必考虑如何生成盐。

答案

不过,我应该回答你的问题。盐是否具有高熵有关系吗?我们可能希望盐在这里具有两个属性,随机性有助于:

  • 在您的数据库中,密码更改之间是唯一的,最好是全局的,这样攻击者一次只能破解一个密码。
  • 攻击者不知道(在泄露之前),因此针对特定帐户的攻击者无法在数据库泄露之前开始任何准备工作。

使用计数器作为盐是一个不错的解决方案,但并不完美。salt 至少在本地是唯一的,但它不是全局唯一的,甚至在同一软件的多次安装中也不是唯一的。攻击者对此并不陌生,但这确实不是什么大问题。一旦散列被泄露,盐也会被泄露。

但是,使用为您提供随机盐的库会更好。不要为了这样重要的事情而乱用自制解决方案!

是的,这很重要,使用已知的盐或通过增加 id 使用的类似盐并不是很安全。您应该使用随机盐。你有一些盐生成器模拟/库等。

TL;DR:这还不够好,而是让你的盐是 /dev/urandom 的 10 个字节。

盐确实很重要,并且用户 ID“不够好” - 这比没有盐要好得多,但是想象“uid as salt”不够好的场景,想象使用多个系统salt is uid, and uid 0 is admin user(例如,在所有 linux 系统上,uid 0 是称为root) 的管理员帐户,如果 Linux 使用 uid 作为密码哈希的盐,我保证会有彩虹表用于 0-salt 攻击 root 密码,你甚至可能如果是这样的话,可以用谷歌搜索哈希,违背了盐的目的:)

(Linux中另一个流行的uid是uid 1000或1001,通常是“第一个用户帐户”,第一个用户帐户通常是具有sudo-access的帐户)