Правильный способ использования шифрования SHA512

Я пытаюсь использовать алгоритм SHA512 в PHP с помощью функции crypt.

Моя соль:

$salt = base64_encode(substr(str_shuffle("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345‌​6789"), 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 — хорошее число, чтобы замедлить атаки грубой силы. Я хотел показать, как вы можете изменить стоимость вручную.

1

Решение

  1. Вы получите большую соль обратно, потому что base64_encode увеличит вашу 12-символьную строку до 16-символьной (это делает кодирование)
  2. Вы можете хранить строку полностью в одном поле, но если вы хотите легкий доступ к соли, вы можете хранить соль в другом поле. (Вам нужно снова соль для повторной проверки, если введенный пароль пользователя правильный — соль только гарантирует, что хэш того же пароля не даст тот же хэш)
  3. SHA512 безопаснее, чем Blowfish? Как Эриксон на стеке потока сказал, что они оба достаточно хороши для этой цели
1

Другие решения

У вас есть это:

$salt = base64_encode(substr(str_shuffle("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"), 0, 12));

Вы можете просто удалить base64_encode из этого, чтобы получить 12 символов соли. Также обратите внимание, что в вашей версии у вас есть не-ascii, непечатаемые символы между 5 и 6. Это, вероятно, вызывает двоичный вывод. Попробуй это:

$salt = substr(str_shuffle("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"), 0, 12);
1

Так что мой вопрос, можно ли хранить этот пароль в базе данных?

Да, просто сохраните все это в базе данных, включая $6$ и rounds=5000000, Это позволяет в будущем переключаться на другой тип хеша, и вы можете просто использовать crypt на весь пароль, чтобы проверить это.

0

Также я уже храню пароли в VARCHAR (255) и мне было интересно, смогу ли я сделать вывод вдвое длиннее, то есть около 255 символов?

В принципе, чем дольше, тем лучше, поэтому SHA512 лучше, чем SHA256. Тем не менее, хэш из 120 символов уже довольно длинный, и нет смысла делать его еще длиннее. Вы можете увеличить длину соли, но не пытайтесь увеличивать хэш, добавляя другой хэш или что-то в этом роде.

0
По вопросам рекламы [email protected]