Лучший метод хеширования PHP для хранения паролей пользователей в таблице MySQL?
Я читал вопросы о переполнении стека около 15 минут, и каждый из них, кажется, противоречит предыдущему, который я читал. Bcrypt, SHA1, MD5 и т.д. Я в настоящее время MD5 мои пароли, но я хочу сделать мою базу данных более безопасной в случае нарушения.
Я знаю, что это было задано в миллион раз, но я не могу найти достойный ответ нигде.
Спасибо.
Ответы
Ответ 1
Причина, по которой вы видите противоречивые ответы, состоит в том, что нет правильного ответа. Вы должны использовать самый безопасный метод, который может поддерживать ваше приложение. Более безопасно = больше накладных расходов.
MD5 был сломан и взломан.
Согласно в этой статье, SHA1 нарушен. Однако он еще не был взломан.
bcrypt не обнаружил (насколько мне известно) нарушение.
При достаточном количестве циклов процессора любой алгоритм хэширования или шифрования может быть в конечном счете обойден. Ваше решение должно сбалансировать безопасность ваших данных с производительностью вашего приложения.
Учитывая эти оговорки, bcrypt является стандартом дефакто в это время. Он рассчитан на прочность, а не на скорость и, как известно, не сломается. Для индекса информации о bcrypt см. Статью bcrypt в Википедии.
Ответ 2
Я бы пошел с bcrypt. Это резко уменьшает способность создавать таблицы радуги.
http://codahale.com/how-to-safely-store-a-password/
Важно отметить, что соли бесполезны для предотвращения атаки словарями или нападений грубой силы. Вы можете использовать огромные соли или много солей или собранную вручную, выращенную в тени, органическую гималайскую розовую соль. Это не влияет на то, как быстро злоумышленник может попробовать пароль кандидата, учитывая хэш и соль из вашей базы данных.
Ответ 3
Прежде всего, MD5 сейчас не очень хороший вариант. Если злоумышленник попадет в вашу базу данных и получит хэши MD5, почти наверняка он также сможет их взломать. MD5 хэши слабых паролей могут быть взломаны даже грубой силой случайным компьютером.
Вы должны опубликовать некоторые статьи о том, как вы солить свои хэши, и использовать этот метод в сочетании с более сильным алгоритмом хэширования (по крайней мере, SHA1) и, возможно, несколько раз повторите этот процесс.
Я не собираюсь писать о соле, так как многие статьи уже написаны об этом, а также здесь, в Stack Overflow, вы можете найти много хороших дискуссий по этой проблеме.
Например.
Почему соли делают словарные атаки "невозможными" ?
или
Как соль для паролей помогает атаковать радужным столом?
Ответ 4
Используйте MD5, SHA1 или любое другое шифрование, которое вы хотите с помощью SALT
.
В этом примере я просто собираюсь использовать MD5 ради объяснения.
Таким образом, пользователь выбирает пароль, который хранится в $password, например.
Теперь создайте соль, специфичную для вашего приложения.
$salt = 'my very own salt'; // or maybe make a random string for your salt
Тогда do
$more_difficult_password = md5($salt . $password);
Таким образом, люди не могут использовать атаки со словарями, просто перейдя по ссылке на вашу строку MD5, если она когда-либо была скомпрометирована.
Ответ 5
Когда пользователь регистрируется, создайте случайный salt
, используя, например, следующую функцию:
$bytes = 50;
$salt = base64_encode(openssl_random_pseudo_bytes($bytes));
Сохраните это в таблице базы данных. Лучше всего хранить его во внешней базе данных. После этого создайте случайный код и сохраните его вместе со своей солью во внешней базе данных. Затем сохраните случайный код в таблице ваших пользователей, и злоумышленник почти не сможет найти вашу соль.
После этого сохраните свой пароль, например, следующим образом:
$password_to_store_in_mysql = hash('sha512', $salt . $user_password);
Когда пользователь входит в систему, выведите соль из внешней базы данных и проверьте, соответствуют ли соль и пароль.
Ответ 6
Вы можете использовать секретный ключ вашего сайта и определенную соль каждого пользователя с вашим паролем. Ваш секретный ключ вашего сайта должен быть сохранен в вашей базе данных, а затем извлечен и использован.
Комбинация будет.
$secret = "your key from database";
$salt = "user salt";// make it randomly
$password = $_POST['password'];
$new_pass = md5($secret.$salt.$password);
Теперь эти комбинации будут храниться в базе данных.
Во время входа в систему повторите эту комбинацию, чтобы она соответствовала.
Я думаю, что это может помочь защитить ваше приложение.
Приветствия..!!