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の各ユーザーアカウントに保存するべきですか?