考虑以下两种方法:
hashedPassword = hash(trulyRandomSalt + password)
Run Code Online (Sandbox Code Playgroud)
其中 hashedPassword 和 trueRandomSalt 存储在数据库中。
hashedPassword = hash(applicationConstantPepper + uniqueUserName + password)
Run Code Online (Sandbox Code Playgroud)
其中 hashedPassword 和 uniqueUserName 存储在数据库中,applicationConstantPepper 存储在应用程序配置中。在这里,uniqueUserName 充当盐,通常是电子邮件地址。
我已经读过这个问题,它有很多重要的信息,但没有解决应用程序恒定胡椒值以及如何使用用户名作为盐来改进。
我一直使用方法一和 32 位加密随机盐。但是,我刚刚看到另一个应用程序中使用了方法二。我对方法二遇到的第一个问题是它将用户名与哈希值联系起来,这样用户名就永远不会在不重新生成哈希值的情况下更改。
方法二有哪些安全问题?哪种方法是最好的使用方法?
如果我们无法解码MD5哈希字符串,那么MD5的目的是什么,我们可以在哪里使用MD5.
因此,在构建webapp并存储密码时,安全性和性能都是要记住的重要事项.由于GPU的速度越来越快,我们已经看到即使盐析SHA1密码也很容易被破解的证据,我想知道存储密码的最佳做法是什么.
我认为,为了增加存储密码的安全性,你可以为salt添加一个秘密.所以例如,这个的python代码可能是:
import hashlib
import hmac
secret = 'XYZ'
h = hmac.new('salt' + secret, 'password')
Run Code Online (Sandbox Code Playgroud)
PS我没有在安全论坛上发布这个,因为我想要一个webapp开发人员的观点.
我并不认为自己是安全方面的专家,但在我看来,添加盐并没有真正产生巨大的影响.
例如,如果用户的密码是john1970且salt是123456,这意味着密码是123456john1970,这会使攻击者更难(如果使用字典攻击,例如彩虹表),攻击者很可能猜猜第一部分是盐.我发现使用非标准方法(如使用一些键进行异或或对字符的代码应用一些简单的数学运算)更有效.我知道你们中的大多数人可能不会同意我的观点,但这对我来说似乎更有意义.
你的意见?
重复:
我试图附加一个随机生成的盐以及我的md5生成的密码.那么我们如何重新检查盐渍密码呢?我们是否需要在Db中保存盐和密码.这是一个好方法.
$pass='password';
$salt = substr(str_shuffle('0123456789abcdefghijklmnopqrstuvwxyz'), 0, 12);
echo md5($pass.$salt);
Run Code Online (Sandbox Code Playgroud)
还请告诉我这是否是正确的腌制方式???