Току що обявих новия курс 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