Я понимаю, что эта тема иногда воспитывалась, но пока я не совсем уверен в этой теме.
Что мне интересно, как вы сольете хэш и работаете с соленым хешем? Если пароль зашифрован с помощью случайной сгенерированной соли, как мы можем проверить его, когда пользователь пытается аутентифицироваться? Нужно ли нам хранить сгенерированный хеш в нашей базе данных?
Существует ли какой-либо конкретный способ получения соли предпочтительно? Какой метод шифрования рекомендуется использовать? Из того, что я слышу, sha256 вполне в порядке.
Будет ли идея, чтобы хэш «пересолился», когда пользователь аутентифицируется? И, наконец, это какой-то важный стимул для безопасности, чтобы перефразировать его кучу раз?
Спасибо!
Ответ заключается не в том, чтобы сделать это самостоятельно. Однострочный, который будет делать все, что вам нужно на PHP, – использовать bcrypt.
Прочтите это, легко понять и объяснить все, что вы просили: http://codahale.com/how-to-safely-store-a-password/
bcrypt учитывает хеширование сам по себе и может быть настроен как «сложный» по мере необходимости для обеспечения целостности паролей ваших пользователей в случае взлома.
О, и мы не «шифруем» пароли, мы их хэш.
Вам нужно сохранить как хэш, так и соль, которая использовалась для вычисления хэша.
Если вы хотите проверить, соответствует ли входное значение исходному входному значению, вы можете пересчитать хэш с той же солью и сравнить сохраненный хэш с новым расчетным. Если они равны, то оба входных значения идентичны (до некоторой определенной вероятности).
Важным также является выбор алгоритма хэширования. Потому что есть быстрые алгоритмы хеширования и довольно медленные алгоритмы хэширования. И, как вы хотите сделать, трудно найти столкновение (по крайней мере в грубой силе), используйте более медленный алгоритм хэширования.
Что мне интересно, как вы сольете хэш и работаете с соленым хешем? Если пароль зашифрован с помощью случайной сгенерированной соли, как мы можем проверить его, когда пользователь пытается аутентифицироваться? Нужно ли нам хранить сгенерированный хеш в нашей базе данных?
Да. Сначала вы создаете соль, затем генерируете хэш из пароля плюс соль и сохраняете как хэш, так и соль вместе.
Существует ли какой-либо конкретный способ получения соли предпочтительно?
Я сомневаюсь, что есть консенсус относительно того, что предпочтительнее. Я использую / dev / random. например
$salt = '$2a$12$' . strtr(substr(base64_encode(shell_exec( 'dd if=/dev/random bs=16 count=1 2>/dev/null' )), 0, 22), '+', '.') . '$'; $hash = crypt($input, $salt);
Какой метод шифрования рекомендуется использовать? Из того, что я слышу, sha256 вполне в порядке.
См. Ответ Компьютерного Гуру, т.е. используйте bcrypt, как в приведенном выше примере. См. Справочную страницу PHP в crypt()
. Если bcrypt не входит в вашу систему, одним из способов получить его является патч Suhosin .
Будет ли идея, чтобы хэш «пересолился», когда пользователь аутентифицируется?
Соль просто делает словарные атаки медленнее. Если у вас есть приличная случайная соль, чтобы начать, я бы не подумал, что ее изменение часто помогает. Вам, вероятно, будет лучше инвестировать ваши усилия, чтобы пользователи могли выбирать хорошие пароли, часто меняя их и сохраняя свой параметр стоимости Blowfish с разумной стоимостью.
И, наконец, это какой-то важный стимул для безопасности, чтобы перефразировать его кучу раз?
Этот вопрос принадлежит миру криптографического дизайна. Я рекомендую вам оставить это экспертам. Другими словами: забудьте об этом – используйте самые распространенные практики.
Что вы обычно делаете, это что-то вроде:
salted = HASH(password . key); // DON'T DO IT LIKE THIS
Где ключ «соль» – секретный ключ, хранящийся в файлах конфигурации. Поэтому, чтобы взломать пароль, вам понадобятся секретный ключ и БД, поэтому их удобно хранить в разных местах.
Поскольку схема, которую я показал, недостаточно сильная, лучше использовать HMAC для этой цели, а затем вручную записать соление. Такая операция такая же простая, как хэш, и PHP это поддерживает.
salted = hash_hmac('sha1',password,key); // <-- this is ok
Смотрите это: http://php.net/manual/en/function.sha1.php
Три простых правила. Хорошо, пять: