나중에 또 써 먹을 거 같아서 기록해둔다.
일단 3가지 방법이 있다.
테스트를 위해서 2,3 번 라이브러리를 maven dependency
에 추가했다.
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.1-android</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.15</version>
</dependency>
<!-- 아래는 그냥 테스트를 위해서... 솔직히 없어도 테스트할 수도 있다 -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>3.21.0</version>
</dependency>
</dependencies>
package me.dailycode;
import com.google.common.hash.Hashing;
import org.apache.commons.codec.digest.DigestUtils;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import static org.assertj.core.api.Assertions.assertThat;
class EncodingTest {
// 테스트용 비번 문자열
private static final String plainPassword = "dailyCodePw!@#!@#";
// https://emn178.github.io/online-tools/sha256.html
// 에서 미리 암호화한 결과값을 가져다가 복붙함
private static final String alreadyEncodedPw
= "a3ff052cbdd7951f813e5cfaa02db7de8e973107bb0c4f2cbea78d77dfffa896";
@Test
@DisplayName("순수 Java 로 비번 암호화")
void testSha256EncodingWithPureJava() {
// Java 기본 방식
try {
// 중요! MessageDigest.getInstance 를 통한 object 는 Thread-Safe 하지 않다.
// 모든 Thread 요청에 대해서 새로이 object 를 생성해야 한다.
byte[] encodedHash
= MessageDigest.getInstance("SHA-256")
.digest(plainPassword.getBytes(StandardCharsets.UTF_8));
StringBuilder hexString = new StringBuilder(2 * encodedHash.length);
for (int i = 0; i < encodedHash.length; i++) {
// 참고) 1 byte 는 2개의 HexString 으로 표현 가능
String hex = Integer.toHexString(0xff & encodedHash[i]);
if (hex.length() == 1) {
hexString.append('0');
}
hexString.append(hex);
}
String resultHexString = hexString.toString();
assertThat(resultHexString).isEqualTo(alreadyEncodedPw).as("must be same");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
@Test
@DisplayName("Apache Commons Codecs 로 비번 암호화")
void testSha256EncodingWithApacheCommonCodecs() {
String resultHexString = DigestUtils.sha256Hex(plainPassword);
assertThat(resultHexString).isEqualTo(alreadyEncodedPw).as("must be same");
}
@Test
@DisplayName("Guava 로 비번 암호화")
void testSha256EncodingWithGoogleGuava() {
String resultHexString
= Hashing.sha256().hashString(plainPassword, StandardCharsets.UTF_8)
.toString();
assertThat(resultHexString).isEqualTo(alreadyEncodedPw).as("must be same");
}
}
결과
https://www.baeldung.com/sha-256-hashing-java
필요하면 위 링크로 접속하여 더 다양한 방법을 알아보자.
난 위의 3가지 방법이면 충분하다고 생각한다.