비밀번호를 SHA-256로 해싱하는 코드

LeeYulhee·2023년 11월 2일
0

👉 SHA-256 해시 함수


  • Secure Hash Algorithm (SHA) 시리즈에 속하는 해시 함수
  • 결과 해시 값은 256비트(32바이트)
  • SHA-2 시리즈 중 하나로 SHA-1 시리즈의 취약점을 개선하기 위해 설계
  • 현재 많은 보안 프로토콜과 시스템에서 사용되는 권장되는 해시 함수 중 하나
  • 비밀번호 저장에 사용되기보다는 메시지 무결성을 확인하는 데 더 자주 사용
    • 비밀번호를 저장할 때는 해싱에 더욱 적합한 알고리즘(예: bcrypt, Argon2)을 사용하고, 솔트(salt)를 추가하여 레인보우 테이블 공격을 방지하는 것이 좋음



👉 구현 코드


import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.nio.charset.StandardCharsets;

public class Encrypt {
    public static void main(String[] args) {    }

    public static String sha256Encode(String password) {
        try {
            MessageDigest md = MessageDigest.getInstance("SHA-256");
            byte[] digest = md.digest(password.getBytes(StandardCharsets.UTF_8));
            return bytesToHex(digest);
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
    }

    private static String bytesToHex(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            sb.append(String.format("%02x", b));
        }
        return sb.toString();
    }
}


👉 코드 설명


import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.nio.charset.StandardCharsets;
  • MessageDigest 클래스
    • Java에서 제공하는 메시지 다이제스트 알고리즘을 위한 클래스
    • 여기서는 SHA-256 해싱을 위해 사용
  • NoSuchAlgorithmException 클래스
    • 요청한 암호화 알고리즘이 제공되지 않을 때 발생하는 예외
  • StandardCharsets 클래스
    • 자바에서 제공하는 표준 문자 인코딩 집합을 정의하는 클래스
    • 여기서는 UTF-8 인코딩을 위해 사용
public static String sha256Encode(String password) {
    try {
        MessageDigest md = MessageDigest.getInstance("SHA-256");
        byte[] digest = md.digest(password.getBytes(StandardCharsets.UTF_8));
        return bytesToHex(digest);
    } catch (NoSuchAlgorithmException e) {
        throw new RuntimeException(e);
    }
}
  • MessageDigest.getInstance("SHA-256")
    • SHA-256 알고리즘을 위한 MessageDigest 객체를 반환
  • password.getBytes(StandardCharsets.UTF_8)
    • 문자열을 UTF-8 바이트 배열로 변환
      • getBytes(Charset charset) 는 String 클래스의 메서드로 byte[]를 return
  • md.digest(...)
    • 바이트 배열을 SHA-256 해싱
  • bytesToHex(digest)
    • 해시된 바이트 배열을 16진수 문자열로 변환하기 위해 호출(아래 코드)
private static String bytesToHex(byte[] bytes) {
    StringBuilder sb = new StringBuilder();
    for (byte b : bytes) {
        sb.append(String.format("%02x", b));
    }
    return sb.toString();
}
  • for (byte b : bytes)
    • 바이트 배열의 각 바이트를 반복하여 처리
  • String.format("%02x", b)
    • 바이트 값을 2자리 16진수 문자열로 포맷팅
    • %02x는 0으로 패딩된 2자리 소문자 16진수 형식 지정자
      • %x : 16진수로 변환하라는 의미입니다.
      • 02 : 최소 2자리를 가져야 하며, 만약 값이 1자리일 경우 앞에 0으로 패딩하라는 의미
        • 바이트는 표기법의 일관성과 가독성을 위해 항상 2자리의 16진수 문자열로 표현
      • 예시
        int value = 5;
        System.out.println(String.format("%x", value));  // 출력: 5
        System.out.println(String.format("%02x", value)); // 출력: 05
profile
끝없이 성장하고자 하는 백엔드 개발자입니다.

0개의 댓글

관련 채용 정보