作者:135369一生真爱_890 | 2023-09-04 12:22
当盐析和散列用户密码时,任何盐显然都会有所帮助.盐有多长时间有什么最佳做法吗?我将盐存储在我的用户表中,所以我希望在存储大小和安全性之间进行最佳权衡.是一个随机的10个字符的盐吗?或者我需要更长的时间?
1> SecurityJoe..:
大多数这些答案都有点误导,并证明了盐和加密密钥之间的混淆.包含salt的目的是修改用于散列每个用户密码的函数,以便每个存储的密码散列都必须单独攻击.唯一的安全要求是每个用户都是唯一的,没有任何好处是不可预测或难以猜测.
盐只需要足够长,以便每个用户的盐都是独特的.即使有十亿注册用户,随机64位盐也不太可能重复,所以这应该没问题.单独重复的盐是一个相对较小的安全问题,它允许攻击者一次搜索两个帐户,但总的来说不会在整个数据库上加快搜索速度.在大多数情况下,即使是32位盐也是可以接受的,在最坏的情况下,它会使攻击者的搜索速度提高约58%.增加盐超过64位的成本并不高,但没有安全理由这样做.
在每个用户的盐之上使用站点范围的盐也有一些好处,这将防止可能与存储在其他站点的密码哈希冲突,并防止使用通用彩虹表,尽管甚至32位盐足以使彩虹表成为不切实际的攻击.
更简单 - 开发人员总是忽略这一点 - 如果你有唯一的用户ID或登录名,那些服务就像盐一样完美.如果这样做,您应该添加一个站点范围的盐,以确保不与具有相同好主意的另一个系统的用户重叠.
盐的不可预测性是有益的.可以预测可预测的盐并将其用于哈希表攻击.例如,如果您的salt只是userID,那么足够长的普通alpha哈希表将不仅包括所有密码,还包括所有用户名+密码组合.
关于最后一段的注意事项,如果您使用站点范围的盐,则应该完全相同:站点范围.不是应用程序范围的,即您安装应用程序的每个新实例都应生成新的站点范围的salt.例如,如果Windows在每个Windows身份验证数据库上使用相同的salt,那么为该salt创建一个彩虹表是值得的,但是如果每次安装Windows都会生成一个新的salt,那么它就不会.
问题不在于盐需要难以猜测.攻击者不需要猜测盐:任何有权访问哈希的人都有盐.问题在于,如果您的盐很常见(如用户名),它们可能与其他站点的盐相同,此时攻击者需要一组更小的彩虹表才能使攻击成为可能.这就是为什么提到每站点盐的想法,以避免与其他站点的这种冲突.
@ NateC-K,你所谈论的每个网站的盐想法叫辣椒.
快速注意:如果使用用户名作为salt,如果用户名更改,则可能会出现问题.实际上,(尽管在客户的设计文档中说了什么),我发现用户经常想要更改用户名.
2> David Schmit..:
当前公认的散列密码标准为每个密码创建一个新的16个字符长的盐,并使用密码哈希存储盐.
当然,应该采取适当的加密护理来创建真正的随机盐.
@CodesInChaos我相信你的意思是[*octet*](http://en.wikipedia.org/wiki/Octet_(计算));-)
*字符*有点不明确.你应该说*byte*.
甚至更好的https://www.owasp.org/index.php/Password_Storage_Cheat_Sheet
3> Stephen Tous..:
编辑:我的下面的答案回答了问题,但"真正的"答案是:只使用bcrypt,scrypt或Argon2.如果你问这样的问题,你几乎肯定会使用太低级别的工具.
老实说,没有可靠的理由不让盐与散列密码的长度相同.如果您使用的是SHA-256,那么您将拥有256位哈希值.没有理由不使用256位盐.
从数学角度来说,超过256位不会对您的安全性有任何改进.但是,加入较短的盐可能总会导致彩虹表赶上盐的长度 - 尤其是较短的盐.
盐抵御彩虹桌.具有256位散列的512位盐仍然只会在最终密码中产生256位的熵.
那不是那么大的交易; 用户几乎不会注意到毫秒散列和半秒散列之间的差异,加上密码散列实际上*应该*需要更长的时间才能减缓暴力攻击 - 尽管典型的三次攻击锁定15分钟更好.您是否"浪费"CPU周期来执行此操作?好吧,无所谓了.无论如何,CPU花费的时间比大多数网站都要多,所以它有什么关系?如果您遇到性能问题,请向外扩展.
[慢速哈希](http://chargen.matasano.com/chargen/2007/9/7/enough-with-the-rainbow-tables-what-you-need-to-know-about-s.html)是一个功能,而不是一个bug.
如果你有一个3位散列,你的9999位盐仍然只会向下散列到3个可能的熵位.彩虹表只需要为每个密码找到三个导致不同输出的盐,这是一个恒定的乘法因子,因此从big-O中丢弃.
.................................................. ....................................特定系统.[盐**的**目的是停止预计算攻击,以便无法搜索哈希并立即反转为明文](http://goo.gl/4GudMb).使用9999位盐,**您的密码仍然是秘密**,而使用3位盐,您的密码现在已为全世界所知(并且他们可以使用它来登录您的其他帐户,因为很多人经常重用密码).我觉得有趣的是,由于其中的"熵"一词,这里的5个人实际上已经对你的评论进行了评论.
4> Andrii Nemch..:
维基百科:
在Linux,BSD Unix和Solaris中使用的SHA2-crypt和bcrypt方法具有128位的盐.在可预见的将来,这些较大的盐值使得几乎任何长度的密码的预计算攻击对这些系统都不可行.
128位(16字节)盐就足够了.您可以将其表示为128 / 4 = 32
十六进制数字序列.