2

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

//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 - 结果 - 实际上包含它给出的盐,并且 $encrypted 前面是 Blowfish 指标$2a$

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

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

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

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

4

2 回答 2

2

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

于 2011-10-28T20:12:39.867 回答
0

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

原因是使用的盐始终可以是 22 个字符,剩下的 $2a$12$ 完全是盐指定的前 28 个字符,其余的将是您密码的哈希值。

于 2017-03-03T11:02:20.483 回答