Лучший способ хранения паролей в базе данных MYSQL

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

Во-первых, md5 и sha1 оказались уязвимыми для атак на столкновение и могут быть легко разрешены радугой (когда они видят, является ли ваш хэш одинаковым в их базе данных общих паролей).

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

Первый – sha512. sha512 является под-версией SHA2. SHA2 еще не доказано, что он уязвим для столкновений, а sha512 будет генерировать 512-битный хеш. Вот пример использования sha512:

<?php hash('sha512',$password); 

Другой вариант называется bcrypt. bcrypt славится своими безопасными хэшами. Это, наверное, самый безопасный и самый настраиваемый.

Прежде чем вы начнете использовать bcrypt, вам нужно проверить, включен ли ваш сервер, введите этот код:

 <?php if (defined("CRYPT_BLOWFISH") && CRYPT_BLOWFISH) { echo "CRYPT_BLOWFISH is enabled!"; }else { echo "CRYPT_BLOWFISH is not available"; } 

Если он вернет, что он включен, то следующий шаг будет прост, все, что вам нужно сделать, чтобы выполнить шифрование пароля (обратите внимание: для большей настраиваемости вам нужно это увидеть. Как вы используете bcrypt для хэширования паролей в PHP? ):

 crypt($password, $salt); 

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

Вот мои доказательства уязвимостей атаки SHA1 и MD5:
http://www.schneier.com/blog/archives/2012/10/when_will_we_se.html , http://eprint.iacr.org/2010/413.pdf ,
http://people.csail.mit.edu/yiqun/SHA1AttackProceedingVersion.pdf ,
http://conf.isi.qut.edu.au/auscert/proceedings/2006/gauravaram06collision.pdf и
Понимание слабости столкновений sha-1

Алгоритмы хеширования, такие как sha1 и md5, не подходят для хранения паролей. Они разработаны, чтобы быть очень эффективными. Это означает, что грубое форсирование происходит очень быстро. Даже если хакер получает копию ваших хешированных паролей, довольно быстро переборщить ее. Если вы используете соль, это делает таблицы радуги менее эффективными, но ничего не делает против грубой силы. Использование более медленного алгоритма делает грубую силу неэффективной. Например, алгоритм bcrypt можно сделать так медленно, как вы хотите (просто измените коэффициент работы), и он использует соли внутри, чтобы защитить от радужных таблиц. Я бы пошел с таким подходом или подобным (например, scrypt или PBKDF2), если бы я был вами.

Храните уникальную соль для пользователя (например, сгенерированную из имени пользователя + электронной почты) и сохраните пароль. При входе в систему получите соль из базы данных и хэш-соль + пароль.
Используйте bcrypt для хеширования паролей.

Пароли в базе данных должны храниться в зашифрованном виде. Рекомендуется одностороннее шифрование (хеширование), такое как SHA2, SHA2, WHIRLPOOL, bcrypt DELETED: MD5 или SHA1. (те, кто старше, уязвим

В дополнение к этому вы можете использовать дополнительную генерируемую пользователем произвольную строку – «соль»:

 $salt = MD5($this->createSalt()); $Password = SHA2($postData['Password'] . $salt); 

createSalt() в этом случае является функцией, которая генерирует строку из случайных символов.

EDIT: или если вы хотите больше безопасности, вы можете добавить 2 соли: $ salt1. $ pass. $ salt2

Другой мерой безопасности, которую вы можете предпринять, является инактивация пользователя: после 5 (или любого другого номера) неправильных попыток входа пользователь блокируется в течение минут (15 минут можно сказать). Это должно свести к минимуму успех нападений грубой силы.

лучше всего использовать crypt для хранения паролей в DB

пример кода:

 $crypted_pass = crypt($password); //$pass_from_login is the user entered password //$crypted_pass is the encryption if(crypt($pass_from_login,$crypted_pass)) == $crypted_pass) { echo("hello user!") } 

документация :

http://www.php.net/manual/en/function.crypt.php

Вы должны использовать одностороннее шифрование (что является способом шифрования значения, поэтому его очень сложно восстановить). Я не знаком с MySQL, но быстрый поиск показывает, что у него есть функция password (), которая делает именно такое шифрование. В БД вы храните зашифрованное значение, и когда пользователь хочет пройти аутентификацию, вы берете пароль, который он предоставил, вы шифруете его с использованием того же алгоритма / функции, а затем вы проверяете, что это значение совпадает с паролем, хранящимся в базе данных, для этого пользователя. Это предполагает, что связь между браузером и вашим сервером безопасна, а именно, что вы используете https.