Подтвердить что ты не робот

Лучший способ кодирования паролей в PHP

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

Я читал пароль по-прежнему, и многие люди, кажется, говорят, что для кодирования пароля следует использовать sha1(). Я все для улучшения безопасности системы, но если я конвертирую в использование shal(), то я не смогу отправить там потерянный пароль.

Что ВЫ используете? Вы можете дать мне какой-то совет? И есть ли способ декодировать читаемый пароль для отправки по электронной почте пользователю?

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

//what I use now
$password_encoded = base64_encode($password);

//what I am considering using
$password_encoded = sha1($password);
4b9b3361

Ответ 1

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

Ни один веб-сайт, который не заинтересован в защите себя или своих пользователей (или имеет лижущий смысл), отправит пользователю свой пароль по электронной почте. Единственное, что мы можем сделать, даже отдаленно закрытое для защиты, - это отправить пользователям электронное письмо с уникальной одноразовой ссылкой, которая позволяет им установить новый пароль.

  • Сохранить хэш (bcrypt или PBKDF2) пароль, который был соленый
  • Отбросьте исходный пароль, как только вы его сохранили. Извлеките его из памяти.
  • Всегда требуется, чтобы пользователь создавал свой собственный новый пароль по каналу SSL

Попытка пройти с чем-нибудь еще - это честно просто халатность. Давайте использовать очень распространенный сценарий, используемый в обсуждениях безопасности:

Пользователь электронной почты Frederic взломан. Это может быть от разблокировки компьютера или с использованием слабого пароля. Несмотря на это, у неё есть доступ к его сообщениям. В идеале это означало бы не что иное, как некоторые неловкие любовные письма, прочитанные незнакомцем. К сожалению, неавторизованный человек обнаруживает, что форум будет отправлять пароль Фредерика в текстовом формате. Как и большинство пользователей, Фредерик использует одинаковый пароль для всего, включая его онлайн-банкинг. Его имя пользователя указано в электронном письме своего банка. Сейчас ситуация очень неудачная.

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

Похожие

На окружающие проблемы и идеи очень много ответов на SO:

Ответ 2

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

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

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

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

Ответ 3

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

Представьте, если вы оставили свой адрес электронной почты открытым. Я мог бы просто запросить, чтобы получить ваш пароль для какого-либо веб-сайта, удалить письмо, и вы никогда не узнаете. С другой стороны, если бы вы потребовали меня вместо пароля RESET, пароль учетной записи изменился, и владелец, очевидно, понял бы, что что-то не так. (Это глупый сценарий, но концепция важна)

Хеши можно "отменить", используя все возможные комбинации слов (или используя таблицы радуги), пока не будет создан соответствующий хеш. Одним из способов избежать этого является добавление/добавление предоставленного пароля с солью, чтобы сделать его очень длинной и непредсказуемой строкой. Соль должна быть уникальной строкой данных, уникальной для отдельной учетной записи.

В PHP нет функции SHA2. SHA-2 - семейство хэш-алгоритмов (SHA-256, SHA-384, SHA-512 и т.д.)

hash('sha256', 'The quick brown fox jumped over the lazy dog.');

Ответ 4

Абсолютное обязательное чтение по этой теме - Jeff own Возможно, вы неправильно храните пароли. Здесь исполнительное резюме:

  • Не придумывайте свою собственную "умную" схему хранения паролей.
  • Никогда не храните пароли как открытый текст.
  • Добавьте длинную уникальную случайную соль для каждого сохраненного вами пароля.
  • Используйте криптографически безопасный хеш.

Ответ 5

Base64Encode предлагает нет безопасность, потому что любой может легко ее отменить.

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

Это не так безопасно, как хэш-кодирование, но если вам нужно отправить пароль, это хороший компромисс.

Вы можете посмотреть библиотеку mcrypt для php http://ca3.php.net/mcrypt

Ответ 6

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

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

$user = "joe";
$password = 'password';

$saved_hash = DB::Query("select hash from users where username = ".quote($user)." LIMIT 1");

if (sha256($password) == $saved_hash) User::authenticated();

Никогда, никогда не отправляйте пароли по электронной почте. Отправьте уникальный, непредсказуемый, сгенерированный ключ, например, в PHP:

$key = sha256(time().rand().$secret_seed);

Отправить этот ключ клиенту, для однократного использования, для установки нового пароля.

Ответ 7

Вы хотите использовать хеш (предпочтительно sha1) с "солью"

Ответ 8

Вы можете делать хеширование на сервере при аутентификации одним быстрым запросом:

SELECT * FROM user WHERE password = MD5(CONCAT(?, salt));