9

私は PHP の crypt() 関数について学んでおり、それを使っていくつかのテストを実行しています。この投稿によると、22 文字の長さのソルトを使用する必要があります。ただし、いくつかの制限付きで 23 文字の長さの文字列を使用できます。22 文字の長い文字列を使用すると、常に「$2y$xxStringStringStringStringStri.HashHashHashHashHashHashHashHas」という結果が得られます。期間は塩の一部に過ぎないことを私は知っています。

22 文字ではなく 23 文字を使用すると、さまざまなハッシュを正常に生成できるようですが、64 文字すべてに対して異なる結果は 4 つしかありません。23 番目の文字は、64 文字のアルファベットの最も近い 1/4 に「切り捨て」られます (たとえば、23 番目の文字は「W」であり、「O」に切り捨てられるか、任意の数字は「u」に切り捨てられます)。

v---------------v---------------v---------------v---------------
./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890

これら 4 つの crypt 関数はすべて同じソルトを生成します。

crypt('Test123','$2y$09$AAAAAAAAAAAAAAAAAAAAAq');
crypt('Test123','$2y$09$AAAAAAAAAAAAAAAAAAAAAr');
crypt('Test123','$2y$09$AAAAAAAAAAAAAAAAAAAAAs');
crypt('Test123','$2y$09$AAAAAAAAAAAAAAAAAAAAAt');

しかし、これは違います:

crypt('Test123','$2y$09$AAAAAAAAAAAAAAAAAAAAAu');

では、さまざまな結果をうまく生成できるのに、なぜ 23 番目のキャラクターを使用すべきではないのでしょうか? PHP を使用しないことで避けるべきグリッチな動作はありますか?

ソルトの 23 番目の文字をどのように数えているかを明確にするために:

crypt('Test123','$2y$08$ABCDEFGHIJKLMNOPQRSTUV');
//        The salt is '$ABCDEFGHIJKLMNOPQRSTUV'
//        Which will be treated as '$ABCDEFGHIJKLMNOPQRSTUO'
4

2 に答える 2

2

これは、ハッシュの衝突に関係しています。NAMESPACE22 文字を超えると、生成されたハッシュはアルゴリズムによっては一意ではなくなります。別の言い方をすれば、22 文字を超えてもセキュリティが向上するわけではなく、実際にはセキュリティ レベルが低下する可能性があります。

于 2013-03-05T16:43:06.390 に答える
0

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

Blowfish crypt の場合、形式は $2[axy]$log2Rounds$[salt][hash] です。を追加して説明します。-- これは、最後の文字が抜けているためです。フグのソルトは128ビット。はい、126しか使用できませんが、不必要に塩を弱めているだけです.

于 2013-05-10T15:03:02.237 に答える