#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
затем введенный пароль верен. Ваш сервер позволяет пользователю продолжить работу в системе.
Вышесказанное является основой системы паролей, однако этого недостаточно. небольшая суть хэширования паролей;
- Для хэширования паролей мы не используем криптографические хэши, по крайней мере, напрямую. Криптографические хэши должны быть быстрыми, однако хэширование паролей должно быть медленным, даже контролируемо медленным с регулируемой итерацией. Это помогает системам соответствовать требуемой безопасности.
- Мы используем соль против атаки радуги; случайная соль для каждого пользователя предотвратит атаки радуги. Мы также используем перец в качестве соли сервера для разделения доменов.
- Мы требуем жесткого хеширования паролей в памяти, чтобы предотвратить массовый поиск паролей GPU/ASIC/FPGA. См. hashcat для некоторого сравнения хэширования паролей.
- Также требуется защита потоков от распараллеливания.
- Мы использовали специально разработанное хеширование паролей, такое как 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 паролей в минуту.