Лучший метод хеширования 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);

Теперь эти комбинации будут храниться в базе данных.

Во время входа в систему повторите эту комбинацию, чтобы она соответствовала.

Я думаю, что это может помочь защитить ваше приложение.

Приветствия..!!