👉 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(...)
- 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진수 형식 지정자