Я изучаю функцию crypt() PHP и выполняю некоторые тесты с ней. Согласно this post, я должен использовать соль длиной 22 символа. Тем не менее, я могу использовать строку длиной 23 символа с некоторыми ограничениями. Когда я использую строку длиной 22 символа, я всегда получаю результат «$ 2y $ xxStringStringStringStri.HashHashHashHashHashHashHashHas». Я знаю, что этот период - только часть соли.Почему я не должен использовать 23-й символ в солите функции crypt()?
Кажется, что если я использую 23 символа вместо 22, я могу успешно сгенерировать разные хэши, но для всех 64 символов есть только 4 разных результата. 23-й символ «округляет» с точностью до 1/4 из 64 символов алфавита (например, 23-й символ «W» и округляется до «O» или любое число округляется до «U»)
v---------------v---------------v---------------v---------------
./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890
Все четыре из этих крипт функций порождают ту же соль:
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'
Есть хорошее объяснение по этому вопросу: http://security.stackexchange.com/questions/20862/php-crypt-trims-the-salt-as-it-would-be-too-long –
Благодарим вас за этот ответ. Хотя это касается только того, что происходит с 23-м символом, поскольку он только сокращается из-за размера бит, разрешенного в функции crypt(). Мой вопрос, по-другому, спросить: «Должен ли я использовать 23-й символ, даже если он будет расколоться на два бита?» или другой способ: «Есть ли глюк в алгоритме PHP, который генерирует неправильные хэши всякий раз, когда используется 23-й символ?» – Andrew