如何处理 BCrypt 散列密码


How to handle BCrypt hashed passwords?

鉴于这个取自 http://php.net/manual/en/function.crypt.php 的例子

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

首先:如果哈希方法是河豚,盐的长度是多少?

这是我为上述示例获得的输出:

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

、舍入和我使用的哈希方法是否有意存储在返回的字符串中? 当我存储在此行为中散列的密码时,我是否存储以 $2a 开头的整个字符串?

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

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

是的,在字符串中存储盐和其他加密参数是有意的;它使您不必手动执行此操作,并在必须更新轮数时保持向后兼容性。

至于盐中的有效字符数,是22。因此,这两行将产生相同的哈希:

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

至于检查数据库的结果,只需使用数据库本身的字符串作为crypt的参数。

这是一个演示。

1)你需要一个22个字符的盐,尽管不是所有的字符22都被使用。这意味着您可以获得相同的哈希值,其中包含一组不同的字符 22。

2)将盐和回合存储在生成的哈希中确实是有意的。这样,您可以从现有哈希中提取此信息,并使用它来检查用户输入。您应该存储整个哈希,长度为 60 个字符。

3)你不需要从哈希中提取参数来测试它,PHP函数为你crypt()。只需将现有哈希作为新的加密参数传递即可。我试图解释如何在文章中使用 bcrypt 进行密码哈希。如果您正在寻找一个著名的图书馆,您可以查看phpass。

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