Мне нужно хешировать пароли для хранения в базе данных. Как я могу сделать это на Java?
Я надеялся взять простой текстовый пароль, добавить случайную соль, затем сохранить соль и хешированный пароль в базе данных.
Затем, когда пользователь захотел войти в систему, я мог взять предоставленный им пароль, добавить случайную соль из данных своей учетной записи, хэшировать ее и посмотреть, соответствует ли она сохраненному хэш-паролю с информацией его учетной записи.
java
passwords
cryptographic-hash-function
Крис Датроу
источник
источник
Ответы:
Вы можете использовать средство, встроенное в среду выполнения Java, для этого. SunJCE в Java 6 поддерживает PBKDF2, который является хорошим алгоритмом для хеширования паролей.
Вот служебный класс, который вы можете использовать для аутентификации по паролю PBKDF2:
источник
BigInteger
: ведущие нули удаляются. Это нормально для быстрой отладки, но я видел ошибки в рабочем коде из-за этого эффекта.Вот полная реализация с двумя методами, делающими именно то, что вы хотите:
Дело в том, что даже если злоумышленник получит доступ как к вашей базе данных, так и к исходному коду, пароли все равно будут в безопасности.
Мы храним
'salt$iterated_hash(password, salt)'
. Соль состоит из 32 случайных байтов, и ее цель в том, что если два разных человека выберут один и тот же пароль, сохраненные пароли будут выглядеть по-разному.Это
iterated_hash
, в основном,hash(hash(hash(... hash(password, salt) ...)))
делает потенциальным злоумышленником, имеющим доступ к вашей базе данных, очень дорого угадывать пароли, хэшировать их и искать хэши в базе данных. Вы должны вычислять этоiterated_hash
каждый раз, когда пользователь входит в систему, но это не будет стоить вам слишком много по сравнению с злоумышленником, который тратит почти 100% своего времени на вычисления хэшей.источник
char[] password
вместоString password
.BCrypt - очень хорошая библиотека, и у нее есть порт Java .
источник
Вы можете использовать Широ (ранее библиотеки JSecurity ) осуществление того , что описывается OWASP .
Также похоже, что библиотека JASYPT имеет аналогичную утилиту .
источник
Вы можете вычислить хэши, используя
MessageDigest
, но это неправильно с точки зрения безопасности. Хеши не должны использоваться для хранения паролей, так как они легко взламываются.Вы должны использовать другой алгоритм, такой как bcrypt, PBKDF2 и scrypt, чтобы хранить ваши пароли. Смотрите здесь .
источник
В дополнение к bcrypt и PBKDF2, упомянутым в других ответах, я бы порекомендовал посмотреть на scrypt
MD5 и SHA-1 не рекомендуются, так как они относительно быстрые, поэтому при использовании распределенных вычислений «плата за час» (например, EC2) или современного высокопроизводительного графического процессора можно «взломать» пароли, используя атаки методом «грубой силы» / по словарю, при относительно низких затратах и разумных время.
Если вы должны использовать их, то, по крайней мере, повторите алгоритм заранее определенное значительное количество раз (1000+).
Смотрите здесь для получения дополнительной информации: /security/211/how-to-securely-hash-passwords
И здесь: http://codahale.com/how-to-safely-store-a-password/ (критикует семейство SHA, MD5 и т. Д. В целях хэширования паролей)
источник
Полностью согласен с Эриксоном, что PBKDF2 является ответом.
Если у вас нет этой опции или вам нужно использовать только хеш, Apache Commons DigestUtils намного проще, чем правильно делать код JCE: https://commons.apache.org/proper/commons-codec/apidocs/org/apache /commons/codec/digest/DigestUtils.html
Если вы используете хеш, используйте sha256 или sha512. На этой странице есть хорошие рекомендации по обработке паролей и хэшированию (обратите внимание, что для обработки паролей хеширование не рекомендуется): http://www.daemonology.net/blog/2009-06-11-cryptographic-right-answers.html
источник
Вы можете использовать Spring Security Crypto (имеет только 2 необязательные зависимости компиляции ), который поддерживает шифрование паролей PBKDF2 , BCrypt , SCrypt и Argon2 .
источник
Хотя рекомендация NIST PBKDF2 уже упоминалась, я хотел бы отметить, что в период с 2013 по 2015 год проводился открытый конкурс на хеширование паролей . В конце концов, в качестве рекомендуемой функции хеширования паролей был выбран Argon2 .
Существует довольно хорошо принятая Java-привязка для исходной библиотеки (native C), которую вы можете использовать.
В среднем случае использования, я не думаю, что это имеет значение с точки зрения безопасности, если вы выбираете PBKDF2 вместо Argon2 или наоборот. Если у вас есть строгие требования к безопасности, я рекомендую рассмотреть Argon2 в вашей оценке.
Для получения дополнительной информации о безопасности функций хеширования паролей см. Security.se .
источник
Здесь у вас есть две ссылки для хеширования MD5 и других методов хеширования:
API Javadoc: https://docs.oracle.com/javase/1.5.0/docs/api/java/security/MessageDigest.html
Учебное пособие: http://www.twmacinta.com/myjava/fast_md5.php
источник
Среди всех стандартных схем хеширования LDAP ssha является наиболее безопасным для использования,
http://www.openldap.org/faq/data/cache/347.html
Я бы просто следовал указанным там алгоритмам и использовал MessageDigest для хеширования.
Вы должны хранить соль в своей базе данных, как вы предложили.
источник
По состоянию на 2020 год наиболее надежный и гибкий алгоритм в использовании,
тот, который с наибольшей вероятностью оптимизирует свои возможности при использовании любого оборудования,
является Argon2id или Argon2i .
Он предоставляет необходимый инструмент калибровки для поиска оптимизированных параметров прочности с учетом целевого времени хеширования и используемого оборудования.
Жадное хеширование памяти поможет против использования GPU для взлома.
Внедрение Spring Security / Bouncy Castle не оптимизировано и относительно недолго, учитывая, что может использовать злоумышленник. cf: Spring документация
Наиболее вероятная реализация, используемая для Java, это mkammerer 's,
jar / библиотека-оболочка официальной нативной реализации, написанной на Rust.
Это хорошо написано и просто в использовании.
Встроенная версия предоставляет встроенные сборки для Linux, Windows и OSX.
В качестве примера, он используется JPMorganChase в тессера проекте безопасности , используемого для обеспечения кворума , его Эфириума реализации cryptocurency.
Вот пример кода от Тессера.
Калибровка может быть выполнена с использованием de.mkammerer.argon2.Argon2Helper # findIterations
Алгоритм SCRYPT и Pbkdf2 также можно откалибровать, написав несколько простых тестов, но для текущих минимальных безопасных значений итераций потребуется больше времени хеширования.
источник
я опирался на это видео из udemy и отредактировал, чтобы он был сильнее случайного пароля
источник