PHPクリプトとソルト-詳細を説明してください

encryption mcrypt php salt
PHPクリプトとソルト-詳細を説明してください

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

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

blowfishに関するドキュメントは非常にまばらであり、PHPのドキュメントでは実際には言及されていないので、ここで暗闇の中を刺すようなものです。

本当に奇妙なことは、このコードを今のように実行しても、失敗しないことです。 暗号化関数からforループの上から ‘$ 2a $ 07 $’を*または*削除すると、*断続的に*暗号化された文字列が返されます。 blowfishの私の理解は、暗号化された文字列は「$ 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.'$');

  9  1


ベストアンサー

crypt()`はソルトの `+`文字を嫌い、他の多くの特殊文字( `*、 `%`など)も嫌いなようです。 それらを除外すると、すべての試行で動作するはずです(ソルトID文字列を繰り返す必要はありません)。

3


私はこの質問が実際に古代の歴史であることを知っていますが、グーグルを検索してそれを見つけた人の利益のために、この質問への答えにbcrypt / EksBlowfish塩がどのように機能するかについてかなり詳細な説明があります:

https://stackoverflow.com/questions/2225720/why-does-crypt-blowfish-generate-the-same-hash-with-two-different-salts [なぜcrypt / blowfishは2つの異なる塩で同じハッシュを生成しますか? ]

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

3


タイトルとURLをコピーしました