Рубрики
Без рубрики

Пример хэширования Java SHA-256 и SHA 3-256

В этой статье показано, как использовать алгоритмы Java SHA-256 и SHA 3-256 для генерации хэш-значения из заданной строки или контрольной суммы из файла.

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

  MessageDigest md = MessageDigest.getInstance("SHA3-256");
  byte[] result = md.digest(input);

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

Примечание Хэширование – это функция одностороннего сжатия для преобразования входных данных разной длины в выходные данные фиксированной длины (хэш-значение).

1. ША-2 и ША-3

1.1 SHA-2 (Алгоритм безопасного хэширования 2) определен в FIPS PUB 180-4 . SHA-2 – это широко используемый алгоритм хеширования, разработанный Агентством национальной безопасности (АНБ) .

Java поддерживает следующие SHA-2 алгоритмы:

  • ША-224
  • SHA-256
  • ША-384
  • ША-512
  • ША-512/224
  • ША-512/256

SHA-256 выдает 256-битный вывод, 32 байта, в то время как SHA-512 выдает 512-битный вывод, 64 байта.

String : Hello World

SHA-256
a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e

SHA-512
2c74fd17edafd80e8447b0d46741ee243b7eb74dd2149a0ab1b9246fb30382f27e853d8585719e0e67cbda0daa8f51671064615d645ae27acb15bfb1447f459b

1.2 SHA-3 (Алгоритм безопасного хэширования 3) определен в FIPS PUB 202 . SHA-3 является последним членом Безопасных алгоритмов хэширования , выпущенных Национальным институтом стандартов и технологий (NIST) .

Java поддерживает следующее SHA-3 алгоритмы:

  • ША3-224
  • SHA3-256
  • ША3-384
  • ША3-512
String : Hello World

SHA3-256
e167f68d6563d75bb25f3aa49c29ef612d41352dc00606de7cbd630bb2665f51

SHA3-512
2c74fd17edafd80e8447b0d46741ee243b7eb74dd2149a0ab1b9246fb30382f27e853d8585719e0e67cbda0daa8f51671064615d645ae27acb15bfb1447f459b

Дальнейшее Чтение

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

Этот пример Java хэширует строку с помощью алгоритма SHA3-256 .

package com.mkyong.crypto.hash;

import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class ShaUtils {

    private static final Charset UTF_8 = StandardCharsets.UTF_8;
    private static final String OUTPUT_FORMAT = "%-20s:%s";

    public static byte[] digest(byte[] input, String algorithm) {
        MessageDigest md;
        try {
            md = MessageDigest.getInstance(algorithm);
        } catch (NoSuchAlgorithmException e) {
            throw new IllegalArgumentException(e);
        }
        byte[] result = md.digest(input);
        return result;
    }

    public static String bytesToHex(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            sb.append(String.format("%02x", b));
        }
        return sb.toString();
    }

    public static void main(String[] args) {

        //String algorithm = "SHA-256"; // if you perfer SHA-2
        String algorithm = "SHA3-256";

        String pText = "Hello World";
        System.out.println(String.format(OUTPUT_FORMAT, "Input (string)", pText));
        System.out.println(String.format(OUTPUT_FORMAT, "Input (length)", pText.length()));

        byte[] shaInBytes = ShaUtils.digest(pText.getBytes(UTF_8), algorithm);
        System.out.println(String.format(OUTPUT_FORMAT, algorithm + " (hex) ", bytesToHex(shaInBytes)));
        // fixed length, 32 bytes, 256 bits.
        System.out.println(String.format(OUTPUT_FORMAT, algorithm + " (length)", shaInBytes.length));


    }
}

Выход

Input (string)      :Hello World
Input (length)      :11
SHA3-256 (hex)      :e167f68d6563d75bb25f3aa49c29ef612d41352dc00606de7cbd630bb2665f51
SHA3-256 (length)   :32

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

Выход

Input (string)      :Hello SHA Hashing
Input (length)      :17
SHA3-256 (hex)      :72fbf4f3a807d344a1ee492ff4183edf72e45fab8dfa6a6e5447226233633bf8
SHA3-256 (length)   :32

3. Контрольная сумма файла Java SHA3-256

Файл в папке ресурсов.

Hello World

В этом примере используется алгоритм SHA3-256 для генерации контрольной суммы для вышеуказанного файла.

package com.mkyong.crypto.hash;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.security.DigestInputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class ShaUtils {

    private static byte[] checksum(String filePath, String algorithm) {

        MessageDigest md;
        try {
            md = MessageDigest.getInstance(algorithm);
        } catch (NoSuchAlgorithmException e) {
            throw new IllegalArgumentException(e);
        }

        try (InputStream is = new FileInputStream(filePath);
             DigestInputStream dis = new DigestInputStream(is, md)) {
            while (dis.read() != -1) ; //empty loop to clear the data
            md = dis.getMessageDigest();
        } catch (IOException e) {
            throw new IllegalArgumentException(e);
        }
        return md.digest();

    }

    public static String bytesToHex(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            sb.append(String.format("%02x", b));
        }
        return sb.toString();
    }

    public static void main(String[] args) {

        String algorithm = "SHA3-256";

        // get file path from resources
        String filePath = ClassLoader.getSystemResource("sha-file.txt").getFile();

        byte[] hashInBytes = checksum(filePath, algorithm);
        System.out.println(bytesToHex(hashInBytes));


    }
}

Выход

e167f68d6563d75bb25f3aa49c29ef612d41352dc00606de7cbd630bb2665f51

4. Исключение NoSuchAlgorithmException

Прочитайте это для всех поддерживаемых Java Алгоритмы дайджеста сообщений . Если мы предоставляем несуществующий алгоритм, например, SHA 4-256 , Java выдает java.security. Исключение NoSuchAlgorithmException .

MessageDigest md = MessageDigest.getInstance("SHA4-256");
java.security.NoSuchAlgorithmException: SHA4-256 MessageDigest not available
	at com.mkyong.crypto.hash.ShaUtils.digest(ShaUtils.java:22)
	at com.mkyong.crypto.hash.ShaUtils.main(ShaUtils.java:65)
Caused by: java.security.NoSuchAlgorithmException: SHA4-256 MessageDigest not available
	at java.base/sun.security.jca.GetInstance.getInstance(GetInstance.java:159)
	at java.base/java.security.Security.getImpl(Security.java:700)
	at java.base/java.security.MessageDigest.getInstance(MessageDigest.java:178)
	at com.mkyong.crypto.hash.ShaUtils.digest(ShaUtils.java:20)
	... 1 more

5. Кодек Apache Commons

В этом примере используется популярный кодек Apache Commons для хэширования строки с помощью алгоритмов SHA.


    commons-codec
    commons-codec
    1.14

import org.apache.commons.codec.digest.DigestUtils;

    // SHA-2
    byte[] hash1 = DigestUtils.sha256("");      // returns byte arrays

    String hash2 = DigestUtils.sha256Hex("");   // returns encoded hex

    // SHA-3
    byte[] hash3 = DigestUtils.sha3_256("");     // returns byte arrays

    String hash4 = DigestUtils.sha3_256Hex("");  // returns encoded hex

6. Добавьте соль в хеширование ША

Соль – это случайные данные, метод предотвращения радужных атак . В Java мы можем использовать SecureRandom для генерации соли (случайных байтов).

  public static byte[] getRandomNonce(int numBytes) {
      byte[] nonce = new byte[numBytes];
      new SecureRandom().nextBytes(nonce);
      return nonce;
  }

В этом примере генерируется случайная соль размером 16 байт и используется ByteBuffer для добавления префикса к строке. В конце концов, мы используем алгоритм SHA 3-256 для генерации хэш-значения из строки соль + .

  // get a 16 bytes random salt.
  byte[] salt = CryptoUtils.getRandomNonce(16);
  byte[] pText = "Hello World".getBytes(StandardCharsets.UTF_8);

  // combine two byte arrays
  byte[] input = ByteBuffer.allocate(salt.length + pText.length)
          .put(salt)
          .put(pText)
          .array();

  // no salt, SHA3-256
  System.out.println(bytesToHex(ShaUtils.digest(pText, "SHA3-256")));

  // 16 bytes salt, SHA3-256
  System.out.println(bytesToHex(ShaUtils.digest(input, "SHA3-256")));

Выход

# no salt
e167f68d6563d75bb25f3aa49c29ef612d41352dc00606de7cbd630bb2665f51

# 16 bytes salt
a6c589937ea475fc942d31d154d359ff569ff99fa32ee5d996ff64eca2e7551b

Примечание Для хэширования паролей мы можем использовать Bcrypt или Аргон2 .

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

$клон git $клон git

$cd java-крипто

Рекомендации

Оригинал: “https://mkyong.com/java/java-sha-hashing-example/”