PHP crypt和salt - 请更多说明

时间:2010-02-03 13:54:32

标签: php encryption salt mcrypt

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

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

因为关于河豚的文档很稀疏而且PHP文档甚至没有提到它,所以我在这里黑暗中刺伤。

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:3)

似乎crypt()不喜欢盐中的+字符,以及许多其他特殊字符(*%等)。如果你过滤它们,它应该适用于每次尝试(并且不需要重复salt id字符串)。

答案 1 :(得分:3)

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

Why does crypt/blowfish generate the same hash with two different salts?

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