2

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

4

2 に答える 2

2

http://us2.php.net/crypt、例3「さまざまなハッシュタイプでのcrypt()の使用」を確認してください。出力例では、salt文字列も暗号化された値の一部であることが示されているため、saltが暗号化の一部であるという問題は仕様によるものと思われます。

于 2011-10-28T20:12:39.867 に答える
0

同じソルトを使用するよりも安全であるため、ランダムに生成してMySQLの各ユーザーアカウントに保存する必要があります。

理由は、使用されるソルトは常に22文字であり、残りの$ 2a $ 12 $はソルトで指定された最初の28文字であり、残りはパスワードのハッシュになるためです。

于 2017-03-03T11:02:20.483 に答える