Согласно crypt() документации, соль должна быть 22 базовых 64 цифры из алфавита "./0-9A-Za -z".
Это пример кода, который они дают:
crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$');
Первая запутанная часть состоит в том, что соль имеет 25 символов, а не 22.
ВопроС# 1: Означает ли это, что соль должна быть дольше, чем 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: Также неплохо прочитать соль из хэша, когда пришло время проверять пароли? Вместо того, чтобы хранить соль в отдельном поле и читать ее оттуда. (Что кажется излишним, поскольку соль, кажется, включена в хэш).