Как хэшировать пароль с помощью SHA-512 в Java?

Я немного исследовал методы шифрования строк Java и, к сожалению, не нашел хорошего руководства по хешированию строк с помощью SHA-512 в Java; Я прочитал несколько блогов о MD5 и Base64, но они не так безопасны, как хотелось бы (на самом деле Base64 не является методом шифрования), поэтому я предпочитаю SHA-512.

спросил 12 окт. 2015 в 16:03

вы можете использовать это для SHA-512 (не лучший выбор для хеширования паролей).

ответил 12 окт. 2015 в 16:13

3 золотых знака26 серебряных знаков45 бронзовых знаков

ответил 12 окт. 2015 в 21:49

2 золотых знака27 серебряных знаков37 бронзовых знаков

ответил 2 июля 2018 в 19:16

14 серебряных знаков22 бронзовых знака

вы можете использовать это для хеширования пароля в Java, если хотите.

ответил 8 окт. 2017 в 21:44

Однако не рекомендуется использовать хэш-функции для паролей, существуют новые алгоритмы, такие как bcrypt или scrypt

ответил 10 апр. 2018 в 14:33

ответил 18 фев. 2018 в 13:11

Содержание
  1. Пример хеширования пароля Spring Security
  2. Обзор PasswordEncoder
  3. Генерация пароля BCrypt
  4. База данных
  5. Включить кодировщик паролей
  6. Проект Демо
  7. Скачать исходный код
  8. MD5 с использованием классаMessageDigest
  9. Md5 с использованием Apache Commons
  10. Md5 с использованием Guava
  11. Заключение
  12. Что за хеширование?
  13. Не рекомендуется
  14. Почему именно SHA-512?
  15. Реализация на Java
  16. Создание соли
  17. Почему это не рекомендуется?
  18. PBKDF2, BCrypt и SCrypt
  19. Почему они рекомендуются?
  20. Реализация PBKDF2 в Java
  21. Реализация BCrypt и SCrypt в Java
  22. Хеширование паролей с помощью Spring Security
  23. Important
  24. Simplest Password Hash with MD5 Algorithm
  25. Java MD5 Hashing Example
  26. Making MD5 More Secure using Salt
  27. Как создать Соль
  28. Генерация MD5 с помощью соли
  29. Лучшая безопасность паролей с использованием алгоритмов SHA
  30. Пример хеширования SHA в Java
  31. Более сильные хэши с использованием алгоритма PBKDF2WithHmacSHA1
  32. Пример хеша Java PBKDF2WithHmacSHA1
  33. Проверка паролей
  34. Хэши с использованием Bcrypt и Scrypt
  35. Создание хеша с использованием Bcrypt с солью
  36. Создание хеша с использованием Scrypt с солью
  37. Заключение

Пример хеширования пароля Spring Security

В этом руководстве мы покажем вам, как использовать BCryptPasswordEncoder для хеширования пароля и выполнения аутентификации при входе в Spring Security.

Обзор PasswordEncoder

Вместо этого вы должны использовать этот новый интерфейс шифрованияPasswordEncoder.

Генерация пароля BCrypt

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

В алгоритме хеширования BCrypt каждый раз приводится другое значение хэша длиной 60.

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

База данных

Создайте таблицы и вставьте пользовательский «пример» для тестирования.

Включить кодировщик паролей

Несколько способов включить кодировщик паролей в конфигурации XML.

4.1 Использование BCryptPasswordEncoder по умолчанию.

4.2 Передайте параметр «сила» в BCryptPasswordEncoder.

4.3 Передайте кодировщик в DaoAuthenticationProvider.

4.4 Пример аннотации.

Проект Демо

Пользователь и пароль в базе данных.

Скачать исходный код

По состоянию на 2020 год наиболее надежным используемым алгоритмом хеширования паролей, который, скорее всего, оптимизирует его надежность на любом оборудовании, является Argon2id или Argon2i, но не его реализация Spring.

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

Жадное хеширование памяти поможет предотвратить использование графического процессора для взлома.

Реализация Spring Security/Bouncy Castle не оптимизирована и относительно слаба, учитывая то, что может использовать злоумышленник.
ср.: Spring документ Argon2 и Scrypt

Текущая реализация использует надувной замок, который не использует
параллелизм/оптимизация, которую будут использовать взломщики паролей, поэтому существует
ненужная асимметрия между нападающим и защитником.

Наиболее заслуживающей доверия используемой реализацией Java является реализация mkammerer,

jar/библиотека-обертка официальной собственной реализации, написанной на C.

Она хорошо написана и проста в использовании.

Встроенная версия предоставляет собственные сборки для Linux, Windows и OSX.

Читайте также:  Вакансии для сотрудников ООО "Фонд пенсионного и социального страхования РФ по г. Москве" в Москва

Например, он используется jpmorganchase в своем проекте безопасности tessera, используемом для защиты Quorum, его реализации криптовалюты Ethereum.

Вот пример:

Объявите библиотеку в вашем POM:

или с градиентом:

Калибровку можно выполнить с помощью de.mkammerer.argon2. Argon2Helper#findIterations

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

MD5 — это широко используемая криптографическая хэш-функция, которая создает 128-битный хэш.

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

MD5 с использованием классаMessageDigest

У нас есть функция хеширования в классеjava.security. Дайджест сообщения. Идея состоит в том, чтобы сначала создать экземплярMessageDigest с таким алгоритмом, который вы хотите использовать в качестве аргумента для синглтона:

А затем продолжайте обновлять дайджест сообщения с помощью функцииupdate():

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

Ниже приведен пример, который генерирует хэш для пароля, а затем проверяет его:

Точно так же мы можем также проверить контрольную сумму файла:

Md5 с использованием Apache Commons

Классorg.apache.commons.codec.digest. DigestUtils значительно упрощает работу по сравнению с описанными выше операциями, которые мы выполняли с помощью классаMessageDigest.

Давайте посмотрим пример для хеширования и проверки пароля:

Md5 с использованием Guava

Ниже приведен еще один более простой подход для генерации контрольных сумм MD5 с использованиемcom.google.common.io. Files.hash:

Заключение

Существуют разные подходы в Java API и других сторонних API, таких как Apache Commons и Guava. Выбирайте разумно, исходя из требований проекта и зависимостей, которым может следовать ваш проект.

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

Мы кратко рассмотрим, что это такое, почему это важно, а также некоторые безопасные и небезопасные способы сделать это на Java.

Что за хеширование?

Хеширование — это процесс создания строки илиhash из заданногоmessage с использованием математической функции, известной какcryptographic hash function.

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

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

Также, однако,password hashing functions should be slow. Быстрый алгоритм поможетbrute force саттаков, в которых хакер попытается угадать пароль путем хеширования и сравнения миллиардов (or trillions) потенциальных паролей в секунду.

Вот некоторые отличные хэш-функции, которые соответствуют всем этим критериям: PBKDF2, BCrypt, andSCrypt.  Но сначала давайте взглянем на некоторые старые алгоритмы и почему они больше не рекомендуются.

Не рекомендуется

Наша первая хеш-функция — алгоритм дайджеста сообщений MD5, разработанный еще в 1992 году.

MessageDigest в Java упрощает вычисление и может быть полезен в других случаях.

Однако за последние несколько летMD5 was discovered to fail the fourth password hashing property погрешил, что стало вычислительно легко создавать коллизии. В довершение всего, MD5 является быстрым алгоритмом и поэтому бесполезен против атак методом перебора.

По этой причине использование MD5 не рекомендуется.

Затем мы рассмотрим SHA-512, который является частью семейства алгоритмов безопасного хеширования, которое началось с SHA-0 еще в 1993 году.

Почему именно SHA-512?

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

SHA-512 представляет самый длинный ключ в третьем поколении алгоритма.

Реализация на Java

Теперь давайте посмотрим, как реализовать алгоритм хеширования SHA-512 в Java.

Во-первых, мы должны понять концепциюsalt. Проще говоря,this is a random sequence that is generated for each new hash.

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

Читайте также:  Сверка с ФСС онлайн через Интернет

Наша новая хеш-функция становится примерно такой:

salt <- generate-salt;
hash <- salt + ‘:’ + sha512(salt + password)

Создание соли

Чтобы ввести соль, воспользуемся классомSecureRandom изjava.security:

Затем мы воспользуемся классомMessageDigest , чтобы настроить шэш-функциюSHA-512 с нашей солью:

MessageDigest md = MessageDigest.getInstance(«SHA-512»);
md.update(salt);

И с добавлением этого мы теперь можем использовать методdigest для генерации нашего хешированного пароля:

Почему это не рекомендуется?

Кроме того, у остальных параметров, которые мы рассмотрим, есть важная особенность: настраиваемая сила.

PBKDF2, BCrypt и SCrypt

PBKDF2, BCrypt и SCrypt — три рекомендуемых алгоритма.

Почему они рекомендуются?

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

Это означает, что по мере увеличения мощности компьютеровwe can slow down the algorithm by changing the inputs.

Реализация PBKDF2 в Java

Теперьsalts are a fundamental principle of password hashing, значит, нам нужен и для PBKDF2:

Затем мы создадимPBEKeySpec иSecretKeyFactory, которые мы создадим с помощью алгоритмаPBKDF2WithHmacSHA1 :

KeySpec spec = new PBEKeySpec(password.toCharArray(), salt, 65536, 128);
SecretKeyFactory factory = SecretKeyFactory.getInstance(«PBKDF2WithHmacSHA1»);

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

Наконец, мы можем использовать нашSecretKeyFactory to для генерации хэша:

Реализация BCrypt и SCrypt в Java

Получается, чтоBCrypt and SCrypt support don’t yet ship with Java, хотя некоторые библиотеки Java поддерживают их.

Одной из таких библиотек является Spring Security.

Хеширование паролей с помощью Spring Security

Хотя Java изначально поддерживает алгоритмы хеширования PBKDF2 и SHA, она не поддерживает алгоритмы BCrypt и SCrypt.

К счастью для нас, Spring Security поставляется с поддержкой всех этих рекомендуемых алгоритмов через интерфейсPasswordEncoder:

Все кодировщики паролей для PBKDF2, BCrypt и SCrypt поддерживают настройку желаемой силы хэша пароля.

Мы можем использовать эти кодировщики напрямую, даже не имея приложения на основе Spring Security. Или, если мы защищаем наш сайт с помощью Spring Security, мы можем настроить желаемый кодировщик паролей через его DSL или черезdependency injection.

И, в отличие от наших примеров выше,these encryption algorithms will generate the salt for us internally. Алгоритм хранит соль в выходном хэше для последующего использования при проверке пароля.

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

И мы рассмотрели некоторые исторические хэш-функции, а также некоторые реализованные в настоящее время, прежде чем кодировать их на Java.

Наконец, мы увидели, что Spring Security поставляется со своими классами шифрования паролей, реализуя массив различных хеш-функций.

Many such hashing algorithms in Java can prove effective for password security.

Important

Please remember that once the password hash has been generated, we can not convert the hash back to the original password.

Simplest Password Hash with MD5 Algorithm

The MD5 Message-Digest Algorithm is a widely used cryptographic hash function that produces a 128-bit (16-byte) hash value. It’s very simple and straightforward; the basic idea is to map data sets of variable length to data sets of a fixed size.

Here, the password to be encoded is often called the “message” and the generated hash value is called the message digest or simply “digest”.

Java MD5 Hashing Example

If you are using MD5 hash in your application, consider adding some salt to your security.

Making MD5 More Secure using Salt

Keep in mind, adding salt is not specific to MD5. We can add a Salt to every other algorithm also. So, please focus on how it is applied rather than its relation with MD5.

Wikipedia defines salt as random data that are used as an additional input to a one-way function that hashes a password or pass-phrase.

In more simple words, salt is some randomly generated text, which is appended to the password before obtaining hash.

Читайте также:  Листки нетрудоспособности

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

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

Нам всегда нужно использовать SecureRandom для создания хороших солей. Класс Java SecureRandom поддерживает алгоритм генератора псевдослучайных чисел «SHA1PRNG», и мы можем им воспользоваться.

Как создать Соль

Давайте посмотрим, как нам следует генерировать соль.

Алгоритм SHA1PRNG используется в качестве криптостойкого генератора псевдослучайных чисел на основе алгоритма дайджеста сообщений SHA-1.

Обратите внимание, что если начальное число не предоставлено, оно будет сгенерировано генератором истинных случайных чисел (TRNG).

Генерация MD5 с помощью соли

Теперь давайте посмотрим на модифицированный пример хеширования MD5:

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

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

Лучшая безопасность паролей с использованием алгоритмов SHA

SHA (алгоритм безопасного хеширования) — это семейство криптографических хеш-функций. Он очень похож на MD5, за исключением того, что генерирует более сильные хэши.

Однако хэши SHA не всегда уникальны, а это означает, что мы можем иметь одинаковые хэши для двух разных входных данных. Когда это происходит, это называется «столкновением». Вероятность столкновения в SHA меньше, чем MD5. Но не беспокойтесь об этих столкновениях, потому что они очень редки.

  • SHA-1 (самый простой – хэш 160 бит)
  • SHA-256 (более сильный, чем SHA-1 – хэш 256 бит)
  • SHA-384 (сильнее, чем SHA-256 – хэш 384 бита)
  • SHA-512 (Сильнее, чем SHA-384 – хэш 512 бит)

Более длинный хэш сложнее взломать. Это основная идея.

Чтобы получить любую реализацию алгоритма, передайте ее в качестве параметра MessageDigest. например

MessageDigest md = MessageDigest.getInstance(«SHA-512»);

//ИЛИ

MessageDigest md = MessageDigest.getInstance(«SHA-256»);

Пример хеширования SHA в Java

Давайте создадим тестовую программу для демонстрации генерации SHA-хеша:

Очень быстро мы можем сказать, что SHA-512 генерирует наиболее надежный хэш.

Более сильные хэши с использованием алгоритма PBKDF2WithHmacSHA1

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

Эта функция по существу реализована с использованием некоторых алгоритмов, интенсивно использующих ЦП, таких как PBKDF2, Bcrypt или Scrypt. Эти алгоритмы принимают в качестве аргумента рабочий коэффициент (также известный как коэффициент безопасности) или количество итераций.

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

Java реализовала алгоритм «PBKDF2» как «PBKDF2WithHmacSHA1».

Пример хеша Java PBKDF2WithHmacSHA1

Давайте посмотрим на примере использования алгоритма PBKDF2WithHmacSHA1.

Проверка паролей

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

Хэши с использованием Bcrypt и Scrypt

Концепция bcrypt аналогична предыдущей концепции, как в PBKDF2. Так уж получилось, что в Java нет встроенной поддержки алгоритма bcrypt, чтобы замедлить атаку, но, тем не менее, вы можете найти одну такую ​​реализацию в прилагаемом исходном коде.

Создание хеша с использованием Bcrypt с солью

Давайте посмотрим на пример кода использования (BCrypt.java доступен в исходном коде).

Создание хеша с использованием Scrypt с солью

Как и bcrypt, я скачал scrypt с github и добавил исходный код алгоритма scrypt в исходный код.

Давайте посмотрим, как использовать реализацию:

Заключение

Приятного обучения!!

Оцените статью
ФСС Help
Добавить комментарий