[Java] 비밀번호 SHA-256 암호화

식빵·2022년 4월 11일
0

Java Lab

목록 보기
6/29
post-thumbnail
post-custom-banner

나중에 또 써 먹을 거 같아서 기록해둔다.
일단 3가지 방법이 있다.

  1. Java 기본 패키지를 사용
  2. commons-codec 라이브러리 사용
  3. guava 라이브러리 사용

테스트를 위해서 2,3 번 라이브러리를 maven dependency 에 추가했다.


🍀 Maven 정보

  <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가지 방법이면 충분하다고 생각한다.

profile
백엔드를 계속 배우고 있는 개발자입니다 😊
post-custom-banner

0개의 댓글