这是使用密码hashigh库的建议方法:
var generator = new PBKDF2();
var salt = Salt.generateAsBase64String(6); // every time is different
var hash = generator.generateKey("mytopsecretpassword", salt , 1000, 32);
[如果以后每次盐都不同,因此哈希也不同,我以后如何检查哈希是否为真?相反,如果我设置一个恒定的盐,那将是不安全的,因为我们应该在代码中保留该值。
现在,由于盐的目的只是为了防止创建预先生成的数据库,因此不需要在数据库中对其进行加密或隐藏。您可以将其以纯文本格式存储。目的是迫使攻击者一旦获得数据库就必须破解散列,而不是只能在彩虹表中查找散列。
但是,有一个警告。如果攻击者在闯入数据库之前可以悄悄地获取盐分,例如通过一些向任何需要盐的人提供盐的脚本,他可以像没有盐一样轻松地为该盐生成彩虹表。这意味着他可以默默地使用您的管理员帐户的费用,生成一个漂亮的大彩虹表,然后入侵您的数据库并立即以管理员身份登录。这使您没有时间发现已发生违规行为,也没有时间采取行动来防止损坏,例如更改管理员密码/锁定特权帐户。这并不意味着您应该隐藏盐或尝试对其进行加密,而只是意味着您应设计系统,以使它们获取盐的唯一方法是闯入数据库。