考虑以下两种方法:
hashedPassword = hash(trulyRandomSalt + password)
hashhedpassword和truyrandomsalt存储在数据库中的位置
hashedPassword = hash(applicationConstantPepper + uniqueUserName + password)
其中hashhedpassword和uniqueUserName存储在数据库中,applicationConstantPepper存储在应用程序配置中。这里,uniqueUserName作为一个盐,通常是电子邮件地址。
我读过这个问题,它有很多很好的信息,但没有解决一个应用程序常数胡椒值,以及如何使用用户名作为盐来改进。
我一直使用32位加密随机盐的方法一。但是,我刚刚看到在另一个应用程序中使用了方法2。方法二的第一个问题是,它将用户名与哈希绑定在一起,因此如果不重新生成哈希,用户名永远不会更改。
方法二的安全问题是什么?哪种方法最好?
考虑以下两种方法:
第一种方法很糟糕,因为它允许获得你的哈希值的攻击者使用像oclHashcat这样的东西来进行,通常每月数万亿或千万亿次的猜测,第二种方法很可怕,因为这些攻击者不仅可以进行相同的,通常每月数万亿或千万亿次的猜测,如果他们在获得密码之前获得了应用程序constantpepper和用户名,他们可以在获取你的密码时预先计算猜测。
请阅读如何安全地散列密码?托马斯·波宁(Thomas Pornin)在书中说:"胡椒要真正适用,你需要在一个特殊的设置中,那里有比带有磁盘的PC更多的东西;你需要一个HSM。"请阅读全文以了解上下文,但其要点是:
- 使用PBKDF2(也称为RFC2898和pkcs# 5v2), BCrypt或SCrypt。
- 无论你的调味料有多好,都不要使用单次哈希算法。
- 使用8-16字节加密随机盐。
- 使用尽可能高的迭代计数/工作因子,使您的机器可以在峰值负载下处理,而不会引起用户抱怨。
- 特别是对于PBKDF2,不要请求或使用比哈希函数的本机大小更多的输出字节。
- SHA-1 20字节
- SHA-224 28字节
- SHA-256 32字节
- SHA-384 48字节
- SHA-512 64 bytes
- 如果你在64位系统上,考虑使用PBKDF2-HMAC-SHA-384或PBKDF2-HMAC-SHA-512,这将减少攻击者使用2014年份GPU的优势。
如果你喜欢胡椒的概念,请阅读密码哈希添加盐+胡椒或盐足够吗?还是托马斯·波林的回答。
考虑以下两种方法…
都不是特别好....
OWASP的John Steven提供了一篇关于密码散列和存储的较好的文章。他会带你了解各种各样的威胁,并解释为什么事情会以某种方式进行。看到方法二的安全问题是什么?
- 密码存储备忘单
- 安全密码存储威胁模型
哪个是最好的方法?
hashedPassword = hash(applicationConstantPepper + uniqueUserName + password)
不提供语义安全。也就是说,使用恒定的pepper和用户名,攻击者可以分辨出预言者回答的是随机答案还是真实答案。
hashedPassword = hash(trulyRandomSalt + password)
可能等于或略优于其他提出的方法。每个用户随机盐有许多理想的属性。但它也可以改进。
最后,为什么要重新发明轮子?去Openwall的可移植PHP密码散列(phpass)并使用它。是《开膛手约翰》的作者写的。Solar Designer紧跟最新的密码破解技术,因此该库在实践中可能非常有用。
除了反弱密码的答案,我想指出的是,两者(盐和胡椒)都有其用途。如果两者都应用,则使用随机盐并将其存储在数据库中(不是派生的),然后使用服务器端密钥(胡椒)加密密码哈希。
我写了一个教程,其中更深入地解释了胡椒的利弊。使用服务器端密钥是一个优势,即使密钥不能被完全保护。
两种方法大致相等,只要使用好的散列(参见其他答案)
使用用户名存在用户名可以被重用的问题。这可能是一个巨大的问题,如果你不包括一个特定于应用程序的前缀,因为用户名可能在很多地方被使用,所以可能已经有一个像样的彩虹表用于该用户名。
"pepper"通过要求彩虹表特定于您的应用程序来帮助缓解这个问题。现在,只有当用户频繁更改密码时,它才会成为一个问题,因为现在攻击者可以通过生成一个彩虹表来获得所有旧密码,而不是每次搜索只获得一个密码。在我看来,这是一个几乎可以忽略不计的缺点,因为
- 大多数人不经常更改密码
- 攻击者仍然需要访问他们想要破解的每个密码的哈希值,因此对于一次性数据库泄露来说,没有区别。
- 任何频繁更改密码的人都可能不会在其他地方重复使用相同的密码,因此获得的额外密码将不那么有用。
总的来说,从攻击者的角度来看,如果将用户名与胡椒结合起来使其独一无二,那么将用户名作为盐的目标不会有太大的收益。