最近我正在读一本关于在数据库中存储密码的安全方法的书。本书以MD5,SHA1和CRYPT_BLOWFISH开头。从我读到的内容我明白,存储密码的更安全的方法是使用CRYPT以及每个用户的随机盐(用户在注册时插入的值,例如用户名),而不将盐存储在数据库中。
所以,让我说我生成一个盐:
$salt = '$2y$11$';
$salt = $salt.md5($username);
我们知道MD5哈希是一个32个字符长的字符串。所以7 + 32 = 39个字符串= SALT
这样的事情:$2y$11$243dc6440dfd91e35a773035da362f4e
然后我使用crypt()
生成哈希:
$hash = crypt($password,$salt);
crypt hash总是产生60个字符的字符串。结果是:
$2y$11$243dc6440dfd91e35a773uY4TBuP14hk.KZq4VvOWV8EhT03Vj8Tu
如果黑客获得对数据库的访问权限,他/她将看到上面60个字符串的部分$2y$11$
。
我的问题是:这些信息对黑客有用吗(知道散列方法和费用)?
我应该存储省略该部分的哈希吗? 243dc6440dfd91e35a773uY4TBuP14hk.KZq4VvOWV8EhT03Vj8Tu
这会让黑客变得更糟吗?
除了这些之外,在黑客获得对数据库的访问权限后,是否还有其他关于密码安全性的建议?
答案 0 :(得分:1)
使用salt来抵御字典攻击和彩虹表攻击,因为由于随机生成的盐添加到密码中,所产生的哈希值不同。
使用哈希保存salt,以便可以从密码+ salt重新生成哈希。 因此,需要保存盐,所以你所做的就是一种可能的方法。
这对黑客没有帮助并且不会让事情变得简单的原因是因为哈希算法的全部意义在于它是否能够被逆转。字典攻击和彩虹表通过使用从“单词”派生到哈希的已知哈希来工作。在原始“单词”前面添加一个随机数,哈希是完全不同的,因此创建一个包含所有可能的盐值的字典或彩虹表(对于给定长度的盐)将是一个庞大的数据库并占用太多时间让黑客破解甚至打扰尝试。
答案 1 :(得分:1)
我写了一篇关于safely storing passwords的教程,它解释了为什么没有必要隐藏哈希参数。
如果隐藏此参数,则实际上会添加服务器端密码(攻击者必须猜测算法和成本因素)。有更好的方法来添加这样的秘密,看一下教程的最后一部分,用服务器端密钥加密哈希值。
答案 2 :(得分:0)
系统似乎是一个3部分系统。
将基础盐和伪随机数据混合并用作最终盐。
或者理论会这样。