在听说 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 中的每个用户帐户中?