Java에서 SHA-256 및 SHA3-256 해싱

자바 탑

방금 Spring 5 및 Spring Boot 2의 기본 사항에 초점을 맞춘 새로운 Learn Spring 과정을 발표했습니다 .

>> 과정 확인

1. 개요

SHA (Secure Hash Algorithm)는 널리 사용되는 암호화 해시 함수 중 하나입니다. 암호화 해시는 텍스트 또는 데이터 파일에 대한 서명을 만드는 데 사용할 수 있습니다. 이 튜토리얼에서는 다양한 Java 라이브러리를 사용하여 SHA-256 및 SHA3-256 해싱 작업을 수행하는 방법을 살펴 보겠습니다.

SHA-256 알고리즘은 거의 고유 한 고정 크기 256 비트 (32 바이트) 해시를 생성합니다. 이것은 단방향 함수이므로 결과를 원래 값으로 다시 해독 할 수 없습니다.

현재 SHA-2 해싱은 암호화 분야에서 가장 안전한 해싱 알고리즘으로 간주되어 널리 사용되고 있습니다.

SHA-3은 SHA-2 이후의 최신 보안 해싱 표준입니다. SHA-2와 비교하여 SHA-3은 고유 한 단방향 해시를 생성하는 다른 접근 방식을 제공하며 일부 하드웨어 구현에서는 훨씬 더 빠를 수 있습니다. SHA-256과 유사하게 SHA3-256은 SHA-3의 256 비트 고정 길이 알고리즘입니다.

NIST는 2015 년에 SHA-3을 출시 했으므로 당분간 SHA-2만큼 많은 SHA-3 라이브러리가 없습니다. 기본 제공 기본 제공 업체에서 SHA-3 알고리즘을 사용할 수 있었던 것은 JDK 9가 되어서야합니다.

이제 SHA-256부터 시작하겠습니다.

2. Java의 MessageDigest 클래스

Java는 SHA-256 해싱을위한 내장 MessageDigest 클래스를 제공합니다 .

MessageDigest digest = MessageDigest.getInstance("SHA-256"); byte[] encodedhash = digest.digest( originalString.getBytes(StandardCharsets.UTF_8));

그러나 여기에서는 16 진수로 해시 된 값을 얻기 위해 사용자 지정 바이트에서 16 진수로의 변환기를 사용해야합니다.

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 

다음 은 SHA-256 해싱을 지원하는 DigestUtils 라는 유틸리티 클래스입니다 .

String sha256hex = DigestUtils.sha256Hex(originalString);

5. 바운시 캐슬 도서관

5.1. Maven 종속성

 org.bouncycastle bcprov-jdk15on 1.60 

5.2. Bouncy Castle 라이브러리를 사용한 해싱

Bouncy Castle API는 16 진 데이터를 바이트로 변환하고 다시 다시 변환하기위한 유틸리티 클래스를 제공합니다.

그러나 먼저 내장 된 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.

다시 말하지만, Keccak-256 해싱을 사용하려면 Bouncy Castle Library를 가져와야합니다.

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

Bouncy Castle API를 사용하여 해싱을 수행 할 수도 있습니다.

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

7. 결론

이 빠른 기사에서는 내장 라이브러리와 타사 라이브러리를 모두 사용하여 Java에서 SHA-256 및 SHA3-256 해싱을 구현하는 몇 가지 방법을 살펴 보았습니다.

위 예제의 소스 코드는 GitHub 프로젝트에서 찾을 수 있습니다.

자바 바닥

방금 Spring 5 및 Spring Boot 2의 기본 사항에 초점을 맞춘 새로운 Learn Spring 과정을 발표했습니다 .

>> 과정 확인