2013-03-05 1 views
9

私は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' 
+1

この質問には良い説明があります:http://security.stackexchange.com/questions/20862/php-crypt-trims-the-salt-as-it-would-be-too-long –

+0

ありがとうございますこの応答。これはcrypt()関数で許されるビットの大きさのために短縮されるだけなので、23文字目に何が起こるかに対処します。私の質問は、別の方法として、「2番目の文字に切り詰めても23番目の文字を使用すべきですか?」という質問です。別の方法は、「PHPのアルゴリズムに、23文字目が使用されるたびに正しくないハッシュを生成する不具合がありますか?」です。 – Andrew

答えて

2

それはハッシュの衝突に関係している:私は塩で23番目の文字をカウントしていますどのように明確にするため

。 22文字を超えると、生成されたハッシュはアルゴリズムのNAMESPACEに応じて一意ではなくなります。別の言い方をすると、22文字以上ではセキュリティが向上せず、実際にセキュリティレベルが低下する可能性があります。

+1

それはセキュリティの2ビットを追加するように私には思われる。私はまだ23日を残しながら塩の中の他の文字を変更することで、異なるハッシュを生成することができます。「a」としましょう。塩があふれているという記事がありますか? [php.net](http://php.net/manual/en/function.crypt.php)でも22文字以上の塩の例を使用しています。 – Andrew

+1

もちろん、別の結果を生成しますが、23文字を使用するとそこに別の文字列があり、正確に同じハッシュになります。これは衝突と呼ばれ、あなたがすべてをユニークに保つためにしようとしているときに、あなたはそれを望んでいません。 –

+0

えええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええと>我々はブローフィッシュの小さな形を持っています。このミニボウフィッシュでは、 "a"や "4"や "I"のような1文字長の塩を入れることができます。塩衝突を開始する前に、64種類の組み合わせがあります。しかし、さらに2ビット( "O"、 "e"、 "u")を追加して64個の固有の塩を256個にすることができます。完全アルファベットでなくても、より安全です。 – Andrew

0

$は実際の塩の一部ではありません。セパレータです。

Blowfish cryptの場合、フォーマットは$ 2 [axy] $ log2Rounds $ [salt] [hash]です。あなたはそれを追加すると説明します。 - それはあなたが最後の文字を欠いているからです。ブローフィッシュの塩は128ビットです。あなたは126を使用することができます、はい、しかし、あなたは不必要に塩を弱めるだけです。

+0

実際に多すぎる文字を使用すると、crypt()はcrypt(パスワード、salt)として使用されるように設計されているため、crypt()では大丈夫です。cryptedPassword == crypt(password、cryptedPassword)これは、出力時にsaltにハッシュを追加し、入力時に関連するsaltバイトのみを使用することで行います。だから、余分な文字は使用されません。 – Zer

関連する問題