私は昨日ここにいて、本当に素晴らしい答えをいくつか得ました。私が得たものをまとめてみると、かなり安全なアルゴリズムになると思います。ソルトを生成する 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.'$');