Лучшая практика хранения имен пользователей и паролей в Базах данных MySQL
Возможный дубликат:
Защищенный хэш и соль для паролей PHP
Я создаю систему, которая хранит учетные данные пользователя (адрес электронной почты, имя пользователя и пароль) в базе данных MySQL и видит противоречивые представления по использованию типов шифрования, соления и шифрования.
Какие лучшие методы вы бы порекомендовали? Кодировка в MD5 или SHA1? Соление или не соление? Шифрование только пароля или всех трех элементов?
Ответы
Ответ 1
Для хеша пароля используйте PBKDF2 it Утвержденный NIST. Вы должны использовать случайную несекретную соль для каждого пароля и нетривиальный (более 1000) счетчик итераций.
Для имени пользователя и электронной почты, вероятно, не стоит шифровать.
Ответ 2
Лучшие практики IMO:
-
Используйте алгоритм хеширования, такой как SHA256 или SHA512. MD5 теперь небезопасен, так как вы можете отменить хэш/выполнить атаку радуги.
-
Используйте сильную соль, чтобы злоумышленник не мог угадать, обычно хешировал пароли, если они когда-либо получали доступ к вашей базе данных.
-
Не используйте шифрование.
-
Только хеш пароли, имена пользователей и электронные письма в порядке как обычный текст.
Ответ 3
Это только действительно пароль, который вам нужен для шифрования. Реально, вы должны быть как Hashing
(что вы имеете в виду, когда говорите, кодирование) в алгоритме, по крайней мере, SHA-256 (я уверен, MD5 и SHA1 трещины?) И Salting
ваши пароли будут более безопасными.
Здесь ответ на предпочтительный способ их хранения: Предпочтительный метод хранения паролей в базе данных
Ответ 4
Имена пользователей и электронные письма не должны быть зашифрованы, вам нужно, чтобы они были в открытом виде, они будут более полезными таким образом.
Что касается паролей: они должны АБСОЛЮТНО быть зашифрованными или хэшированными, предпочтительно с солью. До сих пор я использовал несколько интересную технику для этого: AES, ключом для которого является сам пароль. Поэтому, если пользователь делает свой пароль "blabla123", я бы сохранил его в MySQL, вызвав AES_ENCRYPT('blabla123', 'blabla123')
. Для этого есть 2 преимущества:
- вы не храните ключ шифрования в любом месте
- каждый пароль шифруется с использованием другого ключа. Поэтому, даже если вы выберете ключ, у него будет предел его полезности.
Затем действительность выполняется путем шифрования того, что пользователь вводит и сравнивает значения 2.
Ответ 5
Пароль должен быть защищен хэшированием с сильной солью (либо MD5, либо SHA1 в порядке), чтобы предотвратить атаку с использованием радужных таблиц.
Вы не должны указывать адрес электронной почты - как только вы это сделаете, вы не сможете использовать его ни для чего другого, кроме проверки того, что пользователь вводит, поэтому его хэширование не позволит вам отправлять по электронной почте этого человека. Точно так же имя пользователя было бы лучше всего сохранено в виде обычного текста, чтобы вы могли идентифицировать этого человека.