1. Обзор
SHA (Secure Hash Algorithm) – одна из популярных криптографических хэш-функций. Криптографический хэш можно использовать для создания подписи для текста или файла данных. В этом уроке давайте рассмотрим, как мы можем выполнять операции хэширования SHA-256 и SHA 3-256 с использованием различных библиотек Java.
Алгоритм SHA256 генерирует почти уникальный 256-битный (32-байтовый) хэш фиксированного размера. Это односторонняя функция, поэтому результат не может быть расшифрован обратно к исходному значению.
В настоящее время хеширование SHA-2 широко используется, поскольку оно считается наиболее безопасным алгоритмом хеширования в криптографической сфере.
SHA-3 является последним стандартом безопасного хэширования после SHA-2. По сравнению с SHA-2, SHA-3 обеспечивает другой подход для создания уникального одностороннего хэша, и он может быть намного быстрее в некоторых аппаратных реализациях. Подобно SHA-256, SHA 3-256-это 256-битный алгоритм фиксированной длины в SHA-3.
NIST выпустила SHA-3 в 2015 году, поэтому на данный момент существует не так много библиотек SHA-3, как SHA-2. Только в JDK9 алгоритмы SHA-3 были доступны во встроенных поставщиках по умолчанию.
Теперь давайте начнем с SHA-256.
Дальнейшее чтение:
Локально-чувствительное хеширование в Java с использованием Java-LSH
Хеширование MD5 в Java
Руководство по HashSet на Java
2. Класс MessageDigest в Java
Java предоставляет встроенный MessageDigest класс для хеширования SHA-256:
MessageDigest digest = MessageDigest.getInstance("SHA-256"); byte[] encodedhash = digest.digest( originalString.getBytes(StandardCharsets.UTF_8));
Однако здесь мы должны использовать пользовательский преобразователь байт в шестнадцатеричный, чтобы получить хэшированное значение в шестнадцатеричном формате:
private static String bytesToHex(byte[] hash) { StringBuilder hexString = new StringBuilder(2 * hash.length); for (int i = 0; i < hash.length; i++) { String hex = Integer.toHexString(0xff & hash[i]); if(hex.length() == 1) { hexString.append('0'); } hexString.append(hex); } return hexString.toString(); }
Мы должны знать, что дайджест сообщения не является потокобезопасным . Следовательно, мы должны использовать новый экземпляр для каждого потока.
3. Библиотека Гуавы
Библиотека Google Guava также предоставляет служебный класс для хэширования.
Во-первых, давайте определим зависимость:
com.google.guava guava 20.0
Теперь, вот как мы можем использовать гуаву для хэширования строки:
String sha256hex = Hashing.sha256() .hashString(originalString, StandardCharsets.UTF_8) .toString();
4. Кодеки Apache Commons
Аналогичным образом, мы также можем использовать кодеки Apache Commons:
commons-codec commons-codec 1.11
Вот служебный класс, называемый DigestUtils , который поддерживает хэширование SHA – 256:
String sha256hex = DigestUtils.sha256Hex(originalString);
5. Библиотека Надувного замка
5.1. Зависимость Maven
org.bouncycastle bcprov-jdk15on 1.60
5.2. Хеширование С использованием библиотеки Bouncy Castle
API Bouncy Castle предоставляет служебный класс для преобразования шестнадцатеричных данных в байты и обратно.
Однако сначала необходимо заполнить дайджест с помощью встроенного API Java:
MessageDigest digest = MessageDigest.getInstance("SHA-256"); byte[] hash = digest.digest( originalString.getBytes(StandardCharsets.UTF_8)); String sha256hex = new String(Hex.encode(hash));
6. SHA3-256
Теперь давайте продолжим с SHA3-256. Хэширование SHA3-256 в Java ничем не отличается от SHA-256.
6.1. Класс MessageDigest в Java
Начиная с JDK 9 , мы можем просто использовать встроенный алгоритм SHA3-256:
final MessageDigest digest = MessageDigest.getInstance("SHA3-256"); final byte[] hashbytes = digest.digest( originalString.getBytes(StandardCharsets.UTF_8)); String sha3Hex = bytesToHex(hashbytes);
6.2. Кодеки Apache Commons
Кодеки Apache Commons предоставляют удобную оболочку DigestUtils для класса MessageDigest . Эта библиотека начала поддерживать SHA3-256 с версии 1.11 , и для этого также требуется JDK 9+ :
String sha3Hex = new DigestUtils("SHA3-256").digestAsHex(originalString);
6.3. Keccak-256
Keccak-256-еще один популярный алгоритм хеширования SHA3-256. В настоящее время он служит альтернативой стандартному SHA3-256. Keccak-256 обеспечивает тот же уровень безопасности, что и стандартный SHA 3-256, и отличается от SHA3-256 только правилом заполнения. Он был использован в нескольких блокчейн-проектах, таких как Monero .
Опять же, нам нужно импортировать библиотеку Bouncy Castle, чтобы использовать хэширование Keccak-256:
Security.addProvider(new BouncyCastleProvider()); final MessageDigest digest = MessageDigest.getInstance("Keccak-256"); final byte[] encodedhash = digest.digest( originalString.getBytes(StandardCharsets.UTF_8)); String sha3Hex = bytesToHex(encodedhash);
Мы также можем использовать API Надувного замка для стирки:
Keccak.Digest256 digest256 = new Keccak.Digest256(); byte[] hashbytes = digest256.digest( originalString.getBytes(StandardCharsets.UTF_8)); String sha3Hex = new String(Hex.encode(hashbytes));
7. Заключение
В этой краткой статье мы рассмотрели несколько способов реализации хэширования SHA-256 и SHA 3-256 в Java с использованием как встроенных, так и сторонних библиотек.
Исходный код приведенных выше примеров можно найти в проекте GitHub .