在听说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中的每个用户帐户一起存储?
答案 0 :(得分:2)
签出http://us2.php.net/crypt,示例#3“使用具有不同散列类型的crypt()”。在示例输出中,它显示salt字符串也是加密值的一部分,因此盐作为加密一部分的问题似乎是设计上的。
答案 1 :(得分:0)
您应该使用随机生成一个并将其与MySQL中的每个用户帐户一起存储,因为它比使用相同的盐更安全。
原因是所使用的盐总是22个字符,剩余的$ 2a $ 12 $完全是28个字符,由盐指定,其余的将是您密码的哈希值。