Я немного исследовал методы шифрования строк 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
- Пример хеширования пароля Spring Security
- Обзор PasswordEncoder
- Генерация пароля BCrypt
- База данных
- Включить кодировщик паролей
- Проект Демо
- Скачать исходный код
- MD5 с использованием классаMessageDigest
- Md5 с использованием Apache Commons
- Md5 с использованием Guava
- Заключение
- Что за хеширование?
- Не рекомендуется
- Почему именно SHA-512?
- Реализация на Java
- Создание соли
- Почему это не рекомендуется?
- PBKDF2, BCrypt и SCrypt
- Почему они рекомендуются?
- Реализация PBKDF2 в Java
- Реализация BCrypt и SCrypt в Java
- Хеширование паролей с помощью Spring Security
- Important
- Simplest Password Hash with MD5 Algorithm
- Java MD5 Hashing Example
- Making MD5 More Secure using Salt
- Как создать Соль
- Генерация MD5 с помощью соли
- Лучшая безопасность паролей с использованием алгоритмов SHA
- Пример хеширования SHA в Java
- Более сильные хэши с использованием алгоритма PBKDF2WithHmacSHA1
- Пример хеша Java PBKDF2WithHmacSHA1
- Проверка паролей
- Хэши с использованием Bcrypt и Scrypt
- Создание хеша с использованием Bcrypt с солью
- Создание хеша с использованием Scrypt с солью
- Заключение
Пример хеширования пароля 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 в исходный код.
Давайте посмотрим, как использовать реализацию:
Заключение
Приятного обучения!!





