9

我昨天在这里,得到了一些非常好的答案。我把我得到的东西放在一起,我认为这是一个相当安全的算法。我在使用带有生成盐的 for 循环的河豚时遇到问题。

我正在使用 base64 字符和 for 循环来获取随机字符串。我想把这个生成的字符串作为盐插入到 crypt 函数中。

因为关于河豚的文档非常稀少,而且 PHP 文档甚至没有真正提到它,所以我在这里有点摸不着头脑。

真正奇怪的是,如果你以现在的方式运行这段代码,它不会失败。从 for 循环上方或crypt 函数中删除“$2a$07$”,它将间歇性地返回一个加密字符串。我对河豚的理解是加密的字符串必须以 '$2a$07$' 开头并以 "$' 结尾,因此 crypt 函数中的连接。我真的不需要 for 循环上方的开始字符串,只是想得到摆脱它。

我还想澄清存储随机盐的最佳实践,无论是在数据库中还是通过将 crypt 函数的输出存储在数据库中?

昨天,没有真正的代码被抛出,只是讨论。今天我想把一些代码放在一起,并有一些相当安全的东西。如果有人能提出更好的算法,我总是很开放。

$base64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
$salt = '$2a$07$';

for($i=0; $i<60; $i++)
{
    $salt .= $base64[rand(0,63)];
}

return crypt('password', '$2a$07$'.$salt.'$');
4

2 回答 2

3

似乎crypt()不喜欢+盐中的字符,以及许多其他特殊字符(*%)。如果您将它们过滤掉,它应该在每次尝试时都有效(并且无需重复 salt id 字符串)。

于 2010-02-03T14:19:08.213 回答
3

我知道这个问题现在实际上是古老的历史,但为了任何通过搜索谷歌找到它的人的利益,在这个问题的答案中有一个非常详细的关于 bcrypt/EksBlowfish 盐如何工作的描述:

为什么 crypt/blowfish 使用两种不同的盐生成相同的哈希?

简短的回答是,正如 caf 所说,它使用由[a-zA-Z0-9./],组成的 base64 字母表$作为空(非 0)终止/填充字符。如果您使用该范围之外的任何字符,或者$太早使用,它将出错或无法解释整个盐。

于 2010-11-02T18:10:09.117 回答