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

Java Top

Току що обявих новия курс Learn Spring , фокусиран върху основите на Spring 5 и Spring Boot 2:

>> ПРЕГЛЕД НА КУРСА

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.

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(); }

Трябва да сме наясно, че MessageDigest не е безопасен за нишки . Следователно трябва да използваме нов екземпляр за всяка нишка.

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. Библиотека на Bouncy Castle

5.1. Зависимост на Maven

 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

Now let's continue with SHA3-256. SHA3-256 hashing in Java is nothing quite different from SHA-256.

6.1. MessageDigest Class in Java

Starting from JDK 9, we can simply use the built-in SHA3-256 algorithm:

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 Codecs

Apache Commons Codecs provides a convenient DigestUtils wrapper for the MessageDigest class. This library began to support SHA3-256 since version 1.11, and it requires JDK 9+ as well:

String sha3Hex = new DigestUtils("SHA3-256").digestAsHex(originalString);

6.3. Keccak-256

Keccak-256 is another popular SHA3-256 hashing algorithm. Currently, it serves as an alternative to the standard SHA3-256. Keccak-256 delivers the same security level as the standard SHA3-256, and it differs from SHA3-256 only on the padding rule. It has been used in several blockchain projects, such as Monoro.

Отново трябва да импортираме Bouncy Castle Library, за да използваме хеширането 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 на Bouncy Castle, за да направим хеширане:

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 и SHA3-256 в Java, използвайки както вградени библиотеки, така и библиотеки на трети страни.

Изходният код на примерите по-горе може да бъде намерен в проекта GitHub.

Дъно на Java

Току що обявих новия курс Learn Spring , фокусиран върху основите на Spring 5 и Spring Boot 2:

>> ПРЕГЛЕД НА КУРСА