私はPHPのcrypt()関数について学習しており、いくつかのテストを実行しています。 this postによれば、私は22文字の長さの塩を使うべきです。しかし、私は23文字の長さの文字列を使用できますが、いくつかの制限があります。私が22文字の長い文字列を使うと、私はいつも '$ 2y $ xxStringStringStringStri.HashHashHashHashHashHashHashHas'の結果を得ます。私はその期間が塩の一部であることを知っています。crypt()関数のsaltに23文字目を使用しないでください。
22文字の代わりに23文字を使用すると、正常に異なるハッシュを生成できますが、すべての64文字に対して4つの異なる結果しか得られないようです。 23文字が64文字のアルファベットの最も近い1 /第四に、「切り捨て」(「O」または任意の数のダウン例えば23番目の文字が「W」であるとのラウンド「U」に切り捨て)
v---------------v---------------v---------------v---------------
./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890
これらのcrypt関数はすべて4は、同じ塩生成:
crypt('Test123','$2y$09$AAAAAAAAAAAAAAAAAAAAAq');
crypt('Test123','$2y$09$AAAAAAAAAAAAAAAAAAAAAr');
crypt('Test123','$2y$09$AAAAAAAAAAAAAAAAAAAAAs');
crypt('Test123','$2y$09$AAAAAAAAAAAAAAAAAAAAAt');
をしかし、この1つは異なっている:
crypt('Test123','$2y$09$AAAAAAAAAAAAAAAAAAAAAu');
だから、それが成功した異なる結果を生成することができたとき、私は23文字を使用してはならない理由は? PHPを使用しないで避けなければならない何らかの不具合な動作がPHPにありますか?
crypt('Test123','$2y$08$ABCDEFGHIJKLMNOPQRSTUV');
// The salt is '$ABCDEFGHIJKLMNOPQRSTUV'
// Which will be treated as '$ABCDEFGHIJKLMNOPQRSTUO'
この質問には良い説明があります:http://security.stackexchange.com/questions/20862/php-crypt-trims-the-salt-as-it-would-be-too-long –
ありがとうございますこの応答。これはcrypt()関数で許されるビットの大きさのために短縮されるだけなので、23文字目に何が起こるかに対処します。私の質問は、別の方法として、「2番目の文字に切り詰めても23番目の文字を使用すべきですか?」という質問です。別の方法は、「PHPのアルゴリズムに、23文字目が使用されるたびに正しくないハッシュを生成する不具合がありますか?」です。 – Andrew