Я пытаюсь использовать алгоритм SHA512 в PHP с помощью функции crypt.
Моя соль:
$salt = base64_encode(substr(str_shuffle("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"), 0, 12));
Я получаю что-то вроде этого:
Q4CALzJNenFaZnNK
Я не уверен, почему я получаю длину 16, а я указал 12.
И для хеширования пароля я использую это:
$hashed = crypt('myPassword', '$6$rounds=5000000$'.$salt);
Вывод примерно такой:
$6$rounds=5000000$Q4CALzJNenFaZnNK$9QTP6C.BZ9Z.U85UIEAVX1dEIdShHFoYGgTMvgv9Cx/XZY1mK/n2rY4FuHSoigjgIXfqGZftZSxrrF.cDBzt8/
Длина: 121
Итак, мой вопрос: можно ли хранить этот пароль в базе данных или я должен удалить знаки $, как я видел в нескольких примерах?
Также я уже храню пароли в VARCHAR (255) и мне было интересно, смогу ли я сделать вывод вдвое длиннее, то есть около 255 символов?
Этот способ более безопасен, чем, например, Blowfish?
Мои выводы:
Длина хешированного пароля не так важна, как я сначала подумал (достаточно 60 символов для хранения вместо 128 или 256).
Лучше всего использовать функцию password_hash и забыть о создании собственной соли — php.net знает, что они делают.
Таким образом, я закончил хеширование паролей таким образом:
$hash = password_hash($password, PASSWORD_BCRYPT, array("cost"=>15));
PASSWORD_BCRYPT — это алгоритм Blowfish со стоимостью по умолчанию 10 (раз он запускает алгоритм или что-то в этом роде). 10 — хорошее число, чтобы замедлить атаки грубой силы. Я хотел показать, как вы можете изменить стоимость вручную.
У вас есть это:
$salt = base64_encode(substr(str_shuffle("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"), 0, 12));
Вы можете просто удалить base64_encode
из этого, чтобы получить 12 символов соли. Также обратите внимание, что в вашей версии у вас есть не-ascii, непечатаемые символы между 5 и 6. Это, вероятно, вызывает двоичный вывод. Попробуй это:
$salt = substr(str_shuffle("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"), 0, 12);
Так что мой вопрос, можно ли хранить этот пароль в базе данных?
Да, просто сохраните все это в базе данных, включая $6$
и rounds=5000000
, Это позволяет в будущем переключаться на другой тип хеша, и вы можете просто использовать crypt
на весь пароль, чтобы проверить это.
Также я уже храню пароли в VARCHAR (255) и мне было интересно, смогу ли я сделать вывод вдвое длиннее, то есть около 255 символов?
В принципе, чем дольше, тем лучше, поэтому SHA512 лучше, чем SHA256. Тем не менее, хэш из 120 символов уже довольно длинный, и нет смысла делать его еще длиннее. Вы можете увеличить длину соли, но не пытайтесь увеличивать хэш, добавляя другой хэш или что-то в этом роде.