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