Лучший метод хеширования PHP для хранения пользовательских паролей в таблице MySQL? - PullRequest
11 голосов
/ 24 июня 2011

Я читаю вопросы переполнения стека уже около 15 минут, и кажется, что все они противоречат предыдущему, который я прочитал.Bcrypt, SHA1, MD5 и т. Д.В настоящее время я использую MD5 для своих паролей, но я хочу сделать свою базу данных более безопасной в случае взлома.

Я знаю, что об этом спрашивали миллион раз, но нигде не могу найти достойного ответа.

Спасибо.

Ответы [ 6 ]

11 голосов
/ 24 июня 2011

Причина, по которой вы видите противоречивые ответы, заключается в том, что нет правильного человека.Вы должны использовать наиболее безопасный метод, который может поддерживать ваше приложение.Более безопасный = больше накладных расходов.

MD5 был сломан и взломан.

Согласно этой статье , SHA1 сломан.Однако он еще не был взломан.

bcrypt (насколько мне известно) не был обнаружен как сломанный.

При достаточном количестве циклов ЦП любой алгоритм хеширования или шифрования может в конечном итоге бытьобойдена.Ваше решение должно сбалансировать безопасность ваших данных с производительностью вашего приложения.

Учитывая эти предостережения, в настоящее время bcrypt является стандартом defacto.Он рассчитан на прочность, а не на скорость, и, как известно, не сломан.Индекс информации о bcrypt см. В статье bcrypt в Википедии .

9 голосов
/ 24 июня 2011

Я бы пошел с bcrypt.Это значительно снижает возможность создания радужных таблиц.

http://codahale.com/how-to-safely-store-a-password/

Важно отметить, что соли бесполезны для предотвращения словарных атак или атак методом грубой силы.Вы можете использовать огромные соли или много солей или собирать вручную, выращенную в тени, органическую гималайскую розовую соль.Это не влияет на то, как быстро злоумышленник может использовать пароль-кандидат, учитывая хэш и соль из вашей базы данных.

2 голосов
/ 24 июня 2011

Прежде всего, MD5 в настоящее время не очень хороший вариант.Если злоумышленник попадет в вашу базу данных и получит хэши MD5, почти наверняка он сможет их взломать.Хэши MD5 слабых паролей могут быть взломаны даже грубым ударом на обычном компьютере.

Вам следует зайти в Google несколько статей о засолке ваших хэшей и использовать этот метод в сочетании с более мощным алгоритмом хеширования (по крайней мере, SHA1), и, возможно, повторитьпроцесс несколько раз.

Я не собираюсь писать о солении, так как об этом уже написано много статей, а также здесь, в Переполнении стека, вы можете найти много хороших обсуждений о проблеме.Например, Почему соли делают невозможными атаки по словарю? или Как соль пароля помогает при атаке с использованием радужных таблиц?

1 голос
/ 27 августа 2013

Когда пользователь регистрируется, создайте случайный salt, используя, например, следующую функцию:

$bytes = 50;
$salt = base64_encode(openssl_random_pseudo_bytes($bytes));

Сохраните это в таблице базы данных. Лучше всего хранить его во внешней базе данных. После этого создайте случайный код и сохраните его вместе с солью во внешней базе данных. Чем хранить случайный код в вашей таблице пользователей, и злоумышленник почти не сможет найти вашу соль.

После этого сохраните свой пароль, например, так:

$password_to_store_in_mysql = hash('sha512', $salt . $user_password);

Когда пользователь входит в систему, выведите соль из внешней базы данных и проверьте, совпадают ли соль и пароль.

1 голос
/ 24 июня 2011

Используйте MD5, SHA1 или любое другое шифрование с SALT.

В этом примере я просто собираюсь использовать MD5 для объяснения.

Чтобы пользователь выбирал пароль, сохраните его, например, в $ password.

Теперь создайте соль, специфичную для вашего приложения.

$salt = 'my very own salt'; // or maybe make a random string for your salt

Тогда сделай

$more_difficult_password = md5($salt . $password);

Таким образом, люди не могут использовать атаки по словарю, просто прибегая к помощи строки MD5, если она когда-либо была скомпрометирована.

0 голосов
/ 24 июня 2011

Вы можете использовать секретный ключ вашего сайта и конкретную соль каждого пользователя со своим паролем.Ваш секретный ключ вашего сайта должен быть сохранен в вашей базе данных, а затем получить его и использовать.

Комбинация становится.

$secret = "your key from database";
$salt = "user salt";// make it randomly
$password = $_POST['password'];

$new_pass = md5($secret.$salt.$password);

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

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

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

Cheers .. !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...