Как проверяются пользователи, если пароли НЕ хранятся в базе данных в виде обычного текста?

#database #security #encryption #hash #passwords

Вопрос:

Я знаю, что хранить пароль в виде обычного текста в БД плохо, потому что, если хакеры получат доступ к БД сервера, все имена пользователей и пароли будут полностью раскрыты? Поэтому исходные пароли передаются через хэш-функции, после чего они сохраняются в БД в виде серий непонятных символов одинаковой длины. Это хорошо для безопасности.

Но…как сервер может проверить, вводят ли пользователи правильные пароли или нет? Поскольку пользователи вводят свои пароли в своих исходных формах (например: whoami, ilovecomputer…), но сервер хранит их в «хэшированных» формах (например: 234203409803249580980gfdg41cdvd4, jknegnergiuhiuhdni4584234dfgbn4j….). Как можно сопоставить пароль, введенный пользователем, и пароль, сохраненный на сервере?

Комментарии:

1. сервер проверяет, равен ли хэш вставленного пароля сохраненному хэшу

2. Протестируйте алгоритм Argon2 онлайн: argon2.online — он использует (позже сохраненную) соль и проверяет (сохраненный) хэш: $argon2i$v=19$m=16,t=2,p=1$MTIzNDU2Nzg$f0d2gwsV1GILlR7zQjSplw [используйте тест в виде открытого текста и 12345678 в качестве соли].

Ответ №1:

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

Первый раз: Когда пользователи регистрируются на веб-сайте, им требуется пароль пользователя, обычно два поля. Теперь пароль хэшируется h = H(passwd) и хранится в базе данных для пользователя.

Позднее: Пользователь вводит имя пользователя и пароль, затем сервер получает h их из базы данных, используя имя пользователя. Также хэширует введенный в данный момент пароль pwd . если H(pwd) = h затем введенный пароль верен. Ваш сервер позволяет пользователю продолжить работу в системе.

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

  1. Для хэширования паролей мы не используем криптографические хэши, по крайней мере, напрямую. Криптографические хэши должны быть быстрыми, однако хэширование паролей должно быть медленным, даже контролируемо медленным с регулируемой итерацией. Это помогает системам соответствовать требуемой безопасности.
  2. Мы используем соль против атаки радуги; случайная соль для каждого пользователя предотвратит атаки радуги. Мы также используем перец в качестве соли сервера для разделения доменов.
  3. Мы требуем жесткого хеширования паролей в памяти, чтобы предотвратить массовый поиск паролей GPU/ASIC/FPGA. См. hashcat для некоторого сравнения хэширования паролей.
  4. Также требуется защита потоков от распараллеливания.
  5. Мы использовали специально разработанное хеширование паролей, такое как PBKDF2, Scrypt, Argon2. Argon2 стал победителем последнего конкурса по хешированию паролей. Всем рекомендуется использовать Argon2id в своей новой системе.

Последний и самый важный момент-рассказать пользователю о паролях. Во-первых, затем внедрите методы генерации паролей dicewire или аналогичные, а во-вторых, познакомьте с ними менеджеров паролей, таких как 1passwords.

Ответ №2:

Вот как вы аутентифицируете пользователей, не сохраняя их пароль в открытом тексте.

Для этого вам понадобятся ДВА столбца базы данных. Столбец 1 — Хэш пароля, Столбец 2 — Соль

Столбец 2 — Salt-это случайно сгенерированное значение, которое ваш код/система генерирует для каждого пользователя, и оно является случайным, никогда не подвергаясь воздействию какого-либо пользовательского интерфейса или серверной системы. (Я объясню использование ниже)

Столбец 1 — Будет ХЭШИРОВАННЫМ значением пароля пользователя (объединенная) соль.

Вы можете прочитать больше о хешировании здесь Общие алгоритмы хеширования

Как все это работает:

Хеширование: Хеширование-это способ создания УНИКАЛЬНОГО значения для каждой строки на основе алгоритма. Уникальность зависит от алгоритма, но если у вас нет миллиона записей, с вами все должно быть в порядке. Кроме того, хэш-значение каждой строки уникально. Это означает, что хэш строки «тест» всегда будет одинаковым, скажем, «123».

Соль: Соль-это просто случайная строка, которая добавляется к каждому паролю. Таким образом, значение ХЭША рассчитывается как ПАРОЛЬ пользователя СОЛЬ. Это гарантирует, что даже если несколько пользователей используют один и тот же пароль, их Хэш пароля (ХЭШ(Пароль Соль)) будет уникальным.

Установка пароля

  • Когда пользователь установит свой пароль, он предоставит пароль.
  • Ваш код будет случайным образом генерировать значение «соль».
  • Будет создана третья переменная PasswordAndSalt = пароль соль.
  • Затем будет сгенерирована четвертая переменная hashValue = HASH(PasswordAndSalt).
  • Затем вы сохраните значение HASH в хэше пароля (столбец 1) и Соль в Соли (столбец 2).

Добавление СОЛИ является встречной мерой, поэтому, если два пользователя используют один и тот же пароль, значение ХЭША все равно будет разным.

Проверка пользователя Когда пользователь вводит свое имя пользователя и пароль, именно так будет выполняться ваш код.

Проверьте, существует ли имя пользователя.

  • Если имя пользователя существует, получите его значение СОЛИ.
  • Возьмите предоставленный пользователем пароль и объедините значение СОЛИ, полученное из БД.
  • Вычислите значение ХЭША для пароля СОЛЬ
  • Если вычисленное значение ХЭША соответствует значению СОЛИ в вашей БД, выполните проверку подлинности пользователя.
  • В противном случае сообщите, что аутентификация пользователя не удалась.

Комментарии:

1. Множество алгоритмов хэширования на вашей странице, на которую вы ссылаетесь ( tenminutetutor.com/data-formats/cryptography/… ) устарели и/или небезопасны (потому что они сломаны, например, MD5). Вам следует избегать использования «соленых» хэшей, так как они быстры [да, это проблема в сочетании с хэшированием пароля] и могут быть «легко» пересчитаны. Лучше используйте функции вывода паролей, такие как Argon2 или PBKDF2 . Они используют непрерывные алгоритмы хэширования и замедляют время вычисления, например, до 1/2 секунды за попытку, поэтому хакер может проверять (только) 120 паролей в минуту.