2012-07-09 61 views
1

鉴于该实施例中从http://php.net/manual/en/function.crypt.php如何处理BCrypt哈希密码?

crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$')

首先采取:什么是该盐必须是如果散列法是BLOWFISH长度?

这是输出我得到上面的例子:

$2a$07$usesomesillystringsaled/4C6/vYhuH1f.Z/Kwf8X.c.e0jjHay

是不是故意的盐,查房,什么方法我使用散列存储在返回的字符串中?当我在此行为中存储密码散列时,是否存储以$2a开头的整个字符串?

当在数据库中检查输入的密码时,如何从字符串中检索盐,如果没有将其与哈希的其余部分分开?

编辑:为什么这种方法比使用,比如SHA512/256更安全?如果有人在一堆盐中使用字典攻击/暴力破解方法,他们是否能够更快地破解密码?

回答

1

是的,salt和其他加密参数在字符串中的存储是有意的;它可以节省您必须手动完成并在必须更新循环次数时保持向后兼容性。

至于盐中的有效字符数,it is 22。因此,这两条线将导致相同的哈希:

crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$') 
crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalp$') 

至于从数据库中检查的结果,简单地使用字符串从数据库本身作为crypt参数。

Here is a demonstration.

1

1)你需要一个22字符盐,虽然并没有使用字符22的所有位。这意味着你可以得到相同的散列,并且具有一组不同的字符22.

2)在结果散列中存储salt和rounds确实是故意的。通过这种方式,您可以从现有散列中提取此信息,并使用它来检查用户输入。您应该存储整个哈希,长度为60个字符。

3)你不需要从哈希中提取参数来测试它,那为你的PHP函数crypt()。只需将现有散列作为新的crypt参数传递即可。我试图解释如何在文章password hashes with bcrypt中完成。如果你正在寻找一个知名的图书馆,你可以看看phpass

4)它更安全,因为它需要一定的CPU时间。其他哈希设计的速度很快,但是这使得可以每秒钟以数十亿密码进行暴力攻击。对于新一代计算机,所需时间可以随后用成本因子进行调整。