В 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
Дальнейшее Чтение
- Прочтите это В чем разница между SHA-3 и SHA-256?
- Прочтите это Сравнение функций SHA
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-крипто
Рекомендации
- Википедия – SHA-3
- Википедия – Безопасные Алгоритмы Хэширования
- Алгоритмы Дайджеста сообщений
- Ява – Как преобразовать массивы байтов в шестнадцатеричный
- Java MD5 Пример хеширования
- Java – Как объединять и разделять байтовые массивы
Оригинал: “https://mkyong.com/java/java-sha-hashing-example/”