鉴于这个例子取自http://php.net/manual/en/function.crypt.php
crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$')
首先:如果散列方法是BLOWFISH,那么盐的长度是多少?
这是上面例子的输出:
$2a$07$usesomesillystringsaled/4C6/vYhuH1f.Z/Kwf8X.c.e0jjHay
是否有意将盐,回合以及我正在使用的散列方法存储在返回的字符串中?当我在此行为中存储密码哈希时,是否存储以$2a
开头的整个字符串?
当检查输入的密码与数据库中的密码时,如果没有任何东西将其与散列的其余部分分开,如何从字符串中检索盐?
编辑:为什么这种方法比使用SHA512 / 256更安全?如果有人在使用盐的一堆哈希上使用字典攻击/强力方法,他们是否能够更快地破解密码?
答案 0 :(得分:1)
是的,在字符串中存储salt和其他加密参数是有意的;它可以省去你必须手动操作并在必须更新轮数时保持向后兼容性。
关于盐中有效字符的数量,it is 22。因此,这两行将产生相同的散列:
crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$')
crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalp$')
至于从数据库中检查结果,只需使用数据库本身的字符串作为crypt
的参数。
答案 1 :(得分:1)
1)你需要一个22个字符的盐,虽然不是所有的22个字符都被使用。这意味着您可以使用一组不同的字符22来获取相同的哈希值。
2)在生成的哈希中存储salt和round实际上是故意的。这样,您可以从现有哈希中提取此信息,并使用它来检查用户输入。您应该存储整个哈希值,长度为60个字符。
3)您不需要从哈希中提取参数来对其进行测试,这对您来说是PHP函数crypt()
。只需将现有哈希作为新的crypt参数传递。我试着在文章password hashes with bcrypt中解释如何做到这一点。如果您正在寻找一个知名的图书馆,您可以查看phpass。
4)它更安全,因为它需要一定的CPU时间。其他哈希的设计速度很快,但这样就可以用每秒数十亿的密码进行暴力攻击。对于新一代计算机,所需的时间可以在以后用成本因子进行调整。