9

私は昨日ここにいて、本当に素晴らしい答えをいくつか得ました。私が得たものをまとめてみると、かなり安全なアルゴリズムになると思います。ソルトを生成する for ループでフグを使用すると問題が発生します。

base64 文字と for ループを使用してランダムな文字列を取得しています。この生成された文字列を取得し、crypt 関数にソルトとして挿入します。

フグに関するドキュメントは非常にまばらで、PHP のドキュメントでは実際には言及されていないため、私はここで暗闇を突き刺しています。

本当に奇妙なことは、このコードを現在のように実行すると、失敗しないことです。for ループの上またはcrypt 関数から'$2a$07$' を削除すると断続的に暗号化された文字列が返されます。フグについての私の理解では、暗号化された文字列「$2a$07$」で始まり、「$」で終わる必要があるため、crypt 関数で連結されます。for ループの上の最初の文字列は本当に必要なく、取得したかっただけです。それを取り除きます。

また、ランダムソルトをデータベースに保存するか、暗号化関数の出力をデータベースに保存することで、ベストプラクティスについて明確にしたいと思いますか?

昨日、本当のコードが投げかけられることはなく、議論だけでした。今日はいくつかのコードをまとめて、かなり安全なものを用意したいと思います。誰かがより良いアルゴリズムを思い付くことができれば、私はいつでもオープンです.

$base64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
$salt = '$2a$07$';

for($i=0; $i<60; $i++)
{
    $salt .= $base64[rand(0,63)];
}

return crypt('password', '$2a$07$'.$salt.'$');
4

2 に答える 2

3

この質問は今では事実上古代の歴史であることは知っていますが、グーグルで検索して見つけた人の利益のために、この質問への回答で bcrypt/EksBlowfish ソルトがどのように機能するかについてのかなり詳細な説明があります。

crypt/blowfish が 2 つの異なるソルトで同じハッシュを生成するのはなぜですか?

簡単な答えは、cafが言ったように、null(NOT 0)の終了/パディング文字として、[a-zA-Z0-9./]で構成されるbase64アルファベットを使用することです。$その範囲外または$早すぎる文字を使用すると、エラーが発生するか、ソルト全体が解釈されません。

于 2010-11-02T18:10:09.117 に答える
3

塩漬けのイワナがcrypt()嫌いなようで、その他にもたくさんの特殊なイワナ(など)が苦手なようです。それらを除外すると、すべての試行で機能するはずです(また、ソルト ID 文字列を繰り返す必要はありません)。+*%

于 2010-02-03T14:19:08.213 に答える