Лучший способ кодировать пароли в PHP

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

URL-адрес браузера показывает /test1/. Затем вы делаете запрос /test1/abc, нажимая кнопку отправки, и он был отфильтрован struts2, но он не смог найти действие с именем abc ни в пространстве имен /, ни в пространстве имен по умолчанию, и у вас нет любой ресурс с этим путем, поэтому вы получили ошибку 404.

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

Файл struts.xml должен находиться в пути к классам, это означает, что в папке src или resources. При компиляции он копируется в папку вывода компилятора. После сборки он будет скопирован в WEB-INF/classes из выходной папки компилятора. Эти две папки временно созданы и могут быть удалены перед процессом, поэтому, если у вас нет struts.xml в исходной папке, вам не хватает этого файла при запуске приложения.

Также обратите внимание, что у вас нет страниц JSP в папке webcontent, которые вы использовали в результатах.

14
задан JasonDavis 8 September 2009 в 02:04
поделиться

7 ответов

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

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

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

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

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

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

Связанные

На многие вопросы и идеи были даны очень хорошие ответы на SO:

43
ответ дан 1 December 2019 в 05:53
поделиться

Обязательным к прочтению является статья Джеффа Вы, вероятно, храните пароли неправильно . Вот краткое содержание:

  1. Не изобретайте свою собственную «умную» схему хранения паролей.
  2. Никогда не храните пароли в виде открытого текста.
  3. Добавьте длинную уникальную случайную соль к каждому паролю, который вы храните.
  4. Используйте пароль. криптографически безопасный хэш.
5
ответ дан 1 December 2019 в 05:53
поделиться

Вы должны позволить пользователю СБРОСИТЬ пароль пароль, но никогда не ПОЛУЧАЙТЕ свой пароль. Вот почему вы хотели бы использовать односторонний хэш (SHA2) вместо формы шифрования, которая позволяет вам его декодировать.

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

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

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

hash('sha256', 'The quick brown fox jumped over the lazy dog.');
6
ответ дан 1 December 2019 в 05:53
поделиться

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

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

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

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

10
ответ дан 1 December 2019 в 05:53
поделиться

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

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

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

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

4
ответ дан 1 December 2019 в 05:53
поделиться

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

Используйте необратимый хеш 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);

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

Используйте необратимый хеш 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);

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

Используйте необратимый хеш 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);

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

для одноразового использования, чтобы установить новый пароль.

для одноразового использования, чтобы установить новый пароль.

1
ответ дан 1 December 2019 в 05:53
поделиться

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

0
ответ дан 1 December 2019 в 05:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: