1

鉴于此示例取自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 更安全?如果有人对一堆带有盐的哈希使用字典攻击/蛮力方法,他们能更快地破解密码吗?

4

2 回答 2

1

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

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

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

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

这是一个演示。

于 2012-07-09T02:25:09.577 回答
1

1)您需要一个 22 个字符的盐,尽管并非所有字符 22 位都被使用。这意味着您可以获得相同的哈希,具有一组不同的字符 22。

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

3)您不需要从哈希中提取参数来对其进行测试,这会crypt()为您执行 PHP 功能。只需将现有哈希作为新的 crypt 参数传递。我试图在使用 bcrypt 的密码散列一文中解释如何做到这一点。如果您正在寻找一个知名的库,您可以查看phpass

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

于 2012-07-09T04:53:56.760 回答