hashedPassword = hash(trulyRandomSalt + password)
hashedPassword和trulyRandomSalt存储在数据库中.
hashedPassword = hash(applicationConstantPepper + uniqueUserName + password)
hashedPassword和uniqueUserName存储在数据库中,applicationConstantPepper存储在应用程序配置中.这里,uniqueUserName充当盐,通常是电子邮件地址.
我已经阅读了这篇question,它有很多很好的信息,但没有解决应用程序常量胡椒值以及如何使用用户名作为盐来改进.
我一直使用方法一,使用32位加密随机盐.但是,我刚刚看到在另一个应用程序中使用的方法二.我对方法二的第一个问题是它将用户名绑定到哈希值,这样用户名就永远不会改变而不重新生成哈希值.
方法二有哪些安全问题?
哪种方法最好?Consider the following two methods:
第一种方法很糟糕,因为它允许攻击者使你的哈希值使用像oclHashcat这样的东西,通常每月进行数万亿或数万亿的猜测,第二种方法是可怕的,因为那些相同的攻击者不仅可以制造相同的,通常是数万亿或者每月猜测数以万亿,如果他们在获得密码之前得到了applicationConstantPepper和用户名,他们可以在获取密码时预先计算猜测.
请阅读How to securely hash passwords?,其中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字节>如果您使用的是64位系统,请考虑使用PBKDF2-HMAC-SHA-384或PBKDF2-HMAC-SHA-512,这将降低具有2014年复古GPU的攻击者对您的优势.
如果您还喜欢胡椒概念,请再次阅读Password Hashing add salt + pepper or is salt enough?,Thomas Porrin的回答.
精彩评论