What is the optimal length for user password salt?
在对用户密码进行加盐和散列时,任何加盐都显然会有所帮助。盐应该放多久有什么最佳做法吗?我将在我的用户表中存储盐,所以我希望在存储大小和安全性之间进行最佳权衡。随机10个字符的盐够吗?还是我需要更长的时间?
- 我没有关于盐的长度的建议,但是这里显示的答案有很多不好的信息。您的salt绝对应该是:-随机-每个秘密(不是存储在程序映像或配置文件中的单个值)。salt不是密码机密,因此将其存储在表中没有问题。salt的唯一目的是确保在对同一项的不同实例进行哈希(或加密)时,得到不同的结果。
- 对于那些不知道盐是什么的人:salt">en.wikipedia.org/wiki/salt"(密码学)">salt(密码学)在wikipedia上
- 或者,是否存在盐的长度与哈希输出的长度的最佳比率?8字节的salt对于hmac-sha-256可能足够,但对于hmac-sha-512可能不够。
- 与哈希函数输出大小相同的密码随机salt意味着"尝试所有可能的salts"(加上密码字典)攻击需要与"尝试所有可能的哈希结果"攻击一样多的努力,这是一种标准的暴力。一个较短的salt意味着你可以有一个salt字典加上一个密码字典作为蛮力攻击。
- -1诚然,不回答(甚至尝试)这个问题。
这些答案中的大多数都有点误导,并显示了盐和加密密钥之间的混淆。包含salts的目的是修改用于散列每个用户密码的函数,以便每个存储的密码散列都必须单独受到攻击。唯一的安全性要求是,它们是每个用户唯一的,不可预测或难以猜测对它们没有好处。
盐只需要足够长的时间,以便每个用户的盐都是独一无二的。即使有十亿注册用户,随机64位盐也不太可能重复使用,所以这应该是可以的。一个单独重复的salt是一个相对较小的安全问题,它允许攻击者同时搜索两个帐户,但总的来说不会加快整个数据库的搜索速度。即使32位的盐类在大多数情况下都是可以接受的,在最坏的情况下,它将使攻击者的搜索速度提高约58%。将盐增加到64位以上的成本并不高,但没有安全理由这样做。
在每个用户的salt上使用一个站点范围的salt也有一些好处,这将防止可能与存储在其他站点的密码哈希发生冲突,并防止使用通用彩虹表,尽管即使32位salt足以使彩虹表成为不切实际的攻击。
更简单的是,如果您有唯一的用户ID或登录名,那么开发人员总是忽略这一点,这些ID或登录名非常适合作为salt。如果你这样做了,你应该添加一个站点范围的salt,以确保你不会与另一个有相同想法的系统的用户重叠。
- 有是一个利益和salts是unpredictable。但predictable盐可能是用一predicted和哈希表的攻击。如果你为手段,盐是"用户名,然后一个哈希表,平原α"将包括在足够长passwords只是所有,但所有的username + password combinations。
- 你最后的音符和进一步的款,如果你用一场广泛的盐,那应该是:喂,exactly范围。它的应用范围,即每个新的应用install审你你应该generate一位新群体的盐。用于Windows的贷款人,如果他自己用盐的每一个Windows认证数据库,那么它将创建一个用于worthwhile这彩虹牌,盐,但如果每一新的Windows install所产生的盐,那么它也不会。
- "问题不是真的需要,所以这是坚硬的盐。"attacker不需要这样的猜想:"盐anyone WHO已经接入的哈希已有的盐。"问题是,如果你salts是很常见的(像usernames),他们可能是在自己为那些在其他网站,和在那一点的attacker需要多smaller集"彩虹之feasible让恶意攻击。这就是为什么在每位盐是上述想法,这avoid这类的碰撞与其他网站。
- 注意:如果使用快速usernames AS的盐,这一问题如果usernames可以被改变。practically(是什么,despite说,"客户"与设计文件),我发现,often用户想要改变usernames。
- "natec K,每位盐的想法你谈论的是所谓的辣椒。
当前公认的散列密码标准为每个密码创建一个新的16个字符长的salt,并将salt与密码散列一起存储。
当然,应该采取适当的加密措施来创建真正的随机salt。
- 字符定义有点不明确。你应该说字节。
- @我相信你的意思是八位字节;-)
- 你好!似乎维基百科的文章已经改变了——也许你应该参考en.wikipedia.org/wiki/pbkdf2或者其他什么?
- 或者更好的owasp.org/index.php/password_storage_作弊表
编辑:我下面的答案按要求回答问题,但真正的答案是:只需使用bcrypt、scrypt或argon2。如果你问这样的问题,你几乎可以肯定,你使用的工具水平太低了。
老实说,没有理由不让salt与哈希密码的长度完全相同。如果您使用的是SHA-256,那么您有一个256位散列。没有理由不使用256位的盐。
在数学上,超过256位不会使您的安全性有任何改进。但是使用较短的盐可能最终会导致一个彩虹桌赶上你的盐的长度——尤其是较短的盐。
- 记住,salt和hash算法越长,对站点的性能影响越大
- 这没什么大不了的;用户几乎不会注意到毫秒散列和半秒散列之间的区别,加上密码散列实际上需要更长的时间来减缓暴力攻击——尽管典型的三次攻击锁定15分钟更好。这样做是在浪费CPU周期吗?是的,随便。无论如何,CPU在大多数网站上的空闲时间都比不在网站上的空闲时间长,那么这又有什么关系呢?如果您遇到性能问题,请扩展。
- 您所说的"超过256位不会使您的安全性得到任何提高"是什么意思?我的信念是盐可以抵御
- 盐可以抵御彩虹桌。带有256位散列的512位salt仍然只会在最终密码中产生256位的熵。
- 慢速散列是一个特性,而不是一个bug。
- @斯蒂芬,我不同意。熵在这里不是问题。假设我们有一个3位散列,你是说在3位散列上有3位盐和在3位散列上有9999位盐一样安全。这是不正确的,攻击者只需为您的3位salt+3位散列的所有组合预先生成一整套彩虹表,即使每个秘密都有自己的salt,也能获得破解每行所需的O(1)时间……
- …但是,如果您的盐的长度为9999位,则不太可能已经为该9999位盐预先生成了彩虹表。因此,破解每行所需的时间需要O(m),其中m是执行哈希的成本。
- 如果你有一个3位散列,你的9999位盐仍然只能散列到3位熵。彩虹表只需要为每个密码找到三种盐,这会导致不同的输出,这是一个常量乘法因子,因此从big-o中丢弃。
- 为了澄清这一点,我不需要在彩虹桌上放2^9999盐。彩虹表中的每个密码只有八个(三位值)条目。你又一次一无所获。
- @Pacerier如果你有预算,你可能根本不应该存储凭证——看看OpenID,谷歌或Facebook的登录。
- 还要注意,对这三个位的求解完全等同于强制整个哈希输出空间。
- @Randolpho每个人都有预算,OpenID也有其缺点:quora.com/openid/what-s-wrong-with-openid
- 我喜欢你提供的链接的默认登录选项是facebook和twitter登录。
- @Randolpho Facebook不是OpenID btw。
- 不,这是Oauth的定制口味。但我很肯定我写了"关注OpenID,或谷歌或Facebook登录"。OpenID不是镇上唯一的游戏。
- @johnczajka虽然这句话是真的,但长盐意味着有更多的CPU时间来破解它。
- @Randolpho,我很肯定我写了"facebook不是openid"。另外,一定要阅读这个链接。
- @stephentouset,9999位的salt仍然只能散列到3个可能的熵位,但让我重复一下:熵不是这里的问题。您是否可以以用户身份登录并不重要…………………………‌&8203;…‌&8203;……
- ............................................................与zwnj;与# 8203;与………………………zwnj;与# 8203;特别是系统。学院的目的是停止salts预计算的恶意攻击,是不能被用于在散列和立即反向为纯文本。一个9999位盐,但你password remains秘密,而一个3位的盐,你知道password是现在全世界(和他们能使用它,这是你的另login accounts由于许多人often reuse passwords)。我发现它amusing,这里有5 folks actually upvoted你评论由于字"熵"和它的。
- 不被视salts是私人的。如果你password leaks黑板的散列值,然后你有leaked几乎salts西格尔为好。
维基百科:
The SHA2-crypt and bcrypt methods—used in Linux, BSD Unixes, and
Solaris—have salts of 128 bits. These larger salt values make
precomputation attacks for almost any length of password infeasible
against these systems for the foreseeable future.
号
128位(16字节)的盐就足够了。您可以将它表示为128 / 4 = 32十六进制数字的序列。
- 例如,它似乎是我所做的另一安全系统使用的是一个伟大的,例如"最佳实践"。
- "mklement0谢谢我更新的答案。
一个答案可能是将要使用的散列值用作salt的大小,该散列值在安全性方面提供。
例如,如果要使用sha-512,请使用256位salt,因为sha-512提供的安全性为256位。