SHA-256 Хеширование в Java

SHA-256 и SHA3-256 Хеширование в Java

1. обзор

SHA (Secure Hash Algorithm) - одна из популярных криптографических хеш-функций. Криптографический хеш может использоваться для создания подписи для текста или файла данных. В этом руководстве давайте посмотрим, как мы можем выполнять операции хеширования SHA-256 и SHA3-256 с использованием различных библиотек Java.

АлгоритмSHA-256 генерирует почти уникальный 256-битный (32-байтовый) хэш фиксированного размера. Это односторонняя функция, поэтому результат не может быть расшифрован до исходного значения.

В настоящее время хеширование SHA-2 широко используется, поскольку считается наиболее безопасным алгоритмом хеширования в криптографической сфере.

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

NIST выпустил SHA-3 в 2015 году, так что на данный момент не так много библиотек SHA-3, как SHA-2. Только в JDK 9 алгоритмы SHA-3 стали доступны во встроенных поставщиках по умолчанию.

Теперь давайте начнем с SHA-256.

Дальнейшее чтение:

Хеширование с учетом местоположения в Java с использованием Java-LSH

Краткое и практическое руководство по применению алгоритма локального хеширования в Java с использованием библиотеки java-lsh.

Read more

MD5 хеширование в Java

Краткое описание покажет вам, как бороться с хешированием MD5 в Java.

Read more

Руководство по HashSet в Java

Быстрое, но всеобъемлющее введение в HashSet на Java.

Read more

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) {
    StringBuffer hexString = new StringBuffer();
    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

Теперь вот как мы можем использовать Guava для хеширования строки:

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 Dependency


    org.bouncycastle
    bcprov-jdk15on
    1.60

5.2. Хеширование с использованием библиотеки Bouncy Castle

API Bouncy Castle предоставляет служебный класс для преобразования шестнадцатеричных данных в байты и обратно.

Однако сначала необходимо заполнить дайджест, используя встроенный Java API:

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

Starting from JDK 9, мы можем просто использовать встроенный алгоритм SHA3-256:

final MessageDigest digest = MessageDigest.getInstance(SHA3_256);
final byte[] hashbytes = digest.digest(
  originalString.getBytes(StandardCharsets.UTF_8));
String sha3_256hex = bytesToHex(hashbytes);

6.2. Кодеки Apache Commons

Кодеки Apache Commons предоставляют удобную оболочкуDigestUtils для классаMessageDigest. Эта библиотека начала поддерживать SHA3-256 начиная с версии1.11, а такжеrequires JDK 9+:

String sha3_256hex = new DigestUtils(SHA3_256).digestAsHex(originalString);

6.3. Кечак-256

Keccak-256 - еще один популярный алгоритм хеширования SHA3-256. В настоящее время он служит альтернативой стандарту SHA3-256. Keccak-256 обеспечивает тот же уровень безопасности, что и стандартный SHA3-256, и отличается от SHA3-256 только правилом заполнения. Он использовался в нескольких проектах блокчейн, таких какMonoro.

Опять же, нам нужно импортировать библиотеку 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 sha3_256hex = bytesToHex(encodedhash);

Мы также можем использовать API Bouncy Castle для хеширования:

Keccak.Digest256 digest256 = new Keccak.Digest256();
byte[] hashbytes = digest256.digest(
  originalString.getBytes(StandardCharsets.UTF_8));
String sha3_256hex = new String(Hex.encode(hashbytes));

7. Заключение

В этой быстрой статье мы рассмотрели несколько способов реализации хеширования SHA-256 и SHA3-256 в Java с использованием как встроенных, так и сторонних библиотек.

Исходный код приведенных выше примеров можно найти наGitHub project.