crypt() のドキュメントによると、salt はアルファベット "./0-9A-Za-z" の 22 基数 64 桁である必要があります。
これは彼らが与えるコード例です:
crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$');
最初の紛らわしい部分は、salt の文字数が 22 ではなく 25 であることです。
質問 #1:それは、salt が22 文字より長くなければならないということですか?
それから私は自分で機能をテストし、何かに気づきました. 20文字のソルトを使用すると、これが得られます
// using 20 char salt: 00000000001111111111
crypt('rasmuslerdorf', '$2a$07$00000000001111111111$');
// $2a$07$00000000001111111111$.6Th1f3O1SYpWaEUfdz7ieidkQOkGKh2
したがって、20 文字のソルトを使用すると、ソルト全体が出力されます。塩を別の場所に保管する必要がないので便利です。(ランダムソルトを使いたい)。生成されたハッシュからソルトを読み取ることができます。
ただし、ドキュメントに記載されているように 22 文字のソルト、またはそれより長いソルトを使用すると、最後にソルトが途切れます。
// using 22 char salt: 0000000000111111111122
crypt('rasmuslerdorf', '$2a$07$0000000000111111111122$');
// $2a$07$000000000011111111112uRTfyYkWmPPMWDRM/cUAlulrBkhVGlui
// 22nd character of the salt is gone
// using 25 char salt: 0000000000111111111122222
crypt('rasmuslerdorf', '$2a$07$0000000000111111111122222$');
// $2a$07$000000000011111111112uRTfyYkWmPPMWDRM/cUAlulrBkhVGlui
// Same hash was generated as before, 21 chars of the salt are in the hash
質問 2:塩の適切な長さは正確にはどれくらいですか? 20? 22? より長いです?
質問 #3:また、パスワードをチェックするときにハッシュからソルトを読み取るのは良い考えですか? ソルトを別のフィールドに保存してそこから読み取る代わりに。(塩がハッシュに含まれているように見えるので、これは冗長に思えます)。