为什么我的PHP Blowfish加密会产生如此奇怪的结果?

时间:2011-10-28 20:02:55

标签: php mysql encryption hash blowfish

在听说MD5对密码存储(MySQL)不安全之后,我决定将PHP的 crypt()与Blowfish一起使用(告诉我你是否知道更好的算法)。所以我随机生成一个32个字符的盐并加密给定的字符串。这是代码:

//Some variables
$text = $_POST['text'];
$salt = "";
$length = 32;
$chars = "abcdefghijklmnopqrstuxyvwzABCDEFGHIJKLMNOPQRSTUXYVWZ123456789";
$numchars = strlen($chars);

//Random string generation
for ($i=0; $i <= $length; $i++)
{
    $index = mt_rand(0, $numchars-1);
    $salt .= $chars[$index];
}

//Encrypt $text using Blowfish
$encrypted = crypt($text, "$2a$12$" . $salt . "$");

我得到的结果非常奇怪......有些配置很像这样的加密结果包含多个美元连续唱歌 $ 。使用此代码,$ encrypted--结果 - 实际上包含它给出的盐,$加密前面是Blowfish指标 $ 2a $

顺便说一句,我的PHP版本支持Blowfish。以下是结果示例:

Encrypted "hello"
$encrypted: "$2a$12$az1aszWXtzw9R7Y4Iv97KeUPwcPG9pgx/CAW42F/67X64l60lMvGa"
$salt:             "az1aszWXtzw9R7Y4Iv97KmM6miSXnecKB"

我做错了什么?谢谢你的帮助。

编辑:哇,我只想到了一些事情:我不应该总是使用相同的盐,或者我应该随机生成一个并将其与MySQL中的每个用户帐户一起存储?

2 个答案:

答案 0 :(得分:2)

签出http://us2.php.net/crypt,示例#3“使用具有不同散列类型的crypt()”。在示例输出中,它显示salt字符串也是加密值的一部分,因此盐作为加密一部分的问题似乎是设计上的。

答案 1 :(得分:0)

  

您应该使用随机生成一个并将其与MySQL中的每个用户帐户一起存储,因为它比使用相同的盐更安全。

     

原因是所使用的盐总是22个字符,剩余的$ 2a $ 12 $完全是28个字符,由盐指定,其余的将是您密码的哈希值。