Лучшая практика для хранения имен пользователей и паролей в базах данных MySQL [дубликат]

Возможные Дубликаты:
Безопасный хэш и соль для паролей PHP

Я делаю систему, которая хранит учетные данные пользователя (электронная почта, имя пользователя и пароль) в базе данных MySQL и видела противоречивые представления об использовании шифрования, соления и типов шифрования.

какие методы вы бы порекомендовали? Кодирование в MD5 или SHA1? Солить или не солить? Шифрование только пароля или всех 3 стихии?

5 ответов


для хэша пароля используйте PBKDF2 с это NIST одобрил. Вы должны использовать случайную несекретную соль для каждого пароля и нетривиального (более 1000) количества итераций.

имя пользователя и адрес электронной почты, вероятно, не стоит шифровать.


лучшие практики ИМО:

  • используйте алгоритм хэширования, такой как SHA256 или SHA512. MD5 теперь небезопасен, так как вы можете отменить хэш/выполнить атаку радуги.

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

  • Не используйте шифрование.

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


это только действительно пароль, который вам нужно зашифровать. Реально, вы должны быть оба Hashing (Это то, что вы имеете в виду, когда говорите кодирование) в алгоритме at меньше SHA-256 действительно (я уверен, что MD5 и SHA1 взломать?) и Salting ваши пароли для большей безопасности.

вот ответ на предпочтительный метод их хранения:предпочтительный способ хранения паролей в базе данных


логины и электронные письма не должны быть зашифрованы, вам нужно, чтобы они были в текстовом виде, они будут более полезен.

что касается паролей: они должны абсолютно быть зашифрованным или хэшированным, желательно с солью тоже. До сих пор я использовал несколько интересный метод для этого: AES, ключом для которого является сам пароль. Поэтому, если пользователь делает свой пароль "blabla123", то я бы сохранил его в MySQL, позвонив AES_ENCRYPT('blabla123', 'blabla123'). Есть 2 преимущества для это:

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

действительность затем выполняется путем шифрования того, что пользователь вводит, и сравнения 2 значений.


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

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