nyximos.log

단방향 암호화 알고리즘 - MD5, SHA-256 본문

ETC

단방향 암호화 알고리즘 - MD5, SHA-256

nyximos 2024. 7. 20. 20:51

암호화 : 해시, 서명등을 이용해 정보를 보호하는 방식

단방향 암호화

  • 대부분 Hash 알고리즘을 이용해 구현한다. 
  • 빠른 성능
  • 민감한 정보를 데이터베이스에 저장할때 사용한다.
  • 복호화하지 않을 때 사용

해시 알고리즘

  • 해시가 느리고 길수록 신뢰도가 올라간다.
  • 임의의 크기를 가진 데이터 key를 고정된 데이터의 크기로 변환시키는 알고리즘
  • 키값을 해시 함수 수식에 대입시켜 계산 후 나온 결과를 주소로 사용하여 값에 접근한다.

 

MD5 (Message Digest Algorithm 5)

  • 출력 크기: 128비트 (16바이트), 가장 짧고 빠르다.
  • 보안: 충돌이 발생하기 쉬워 보안이 취약하다.
  • 사용 예: 데이터 무결성 검증, 체크섬 계산 등 (보안이 중요하지 않은 경우)

 

SHA-256 (Secure Hash Algorithm 256-bit)

  • 출력 크기: 256비트 (32바이트), 가장 긴 해시를 생성한다.
  • 보안: MD5보다 훨씬 강력한 보안성을 제공. 현재까지는 안전한 알고리즘으로 간주한다.
  • 보안이 중요한 경우, 데이터 무결성 검증, 디지털 서명, 인증서 등에 사용한다.
  • 속도: MD5보다 느림

Java MessageDigest

JDK 9부터는 내장된 SHA3-256 알고리즘을 간단히 사용할 수 있다.

final MessageDigest digest = MessageDigest.getInstance("SHA3-256");
final byte[] hashbytes = digest.digest(
  originalString.getBytes(StandardCharsets.UTF_8));
String sha3Hex = bytesToHex(hashbytes);

 

 

Rainbow Table

해시 함수를 사용하여 변환 가능한 모든 해시값을 저장해둔 표

해시된 비밀번호가 유출될 경우 Rainbow Table을 이용해 비밀번호를 복구 할 수 있다.

 

Salt

해시 알고리즘에서 보안성을 강화하기 위해 사용되는 추가 데이터

고유한 무작위 데이터를 추가하여 해시값을 생성한다.

따라서 같은 비밀번호라도 다른 해시값이 생성된다.

 

 

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Base64;

public class EncryptUtils {
    public static String generateSalt() {
        SecureRandom random = new SecureRandom();
        byte[] salt = new byte[16];
        random.nextBytes(salt);         // 배열에 랜덤한 바이트 값 채우기
        return Base64.getEncoder().encodeToString(salt);  // Base64로 인코딩해서 문자열로 변환
    }

    public static String encryptSHA256WithSalt(String input, String salt) {
        StringBuilder sb = new StringBuilder();
        String saltedInput = sb.append(input).append(salt).toString(); // saltedInput 문자열을 생성
        try {
            // SHA3-256 해시를 계산하여 바이트 배열로 반환
            MessageDigest digest = MessageDigest.getInstance("SHA3-256");
            byte[] hash = digest.digest(saltedInput.getBytes());
            return byteToHex(hash);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    // 바이트 배열을 16진수 문자열로 변환
    private static String byteToHex(byte[] bytes) {
        StringBuilder hexString = new StringBuilder();
        for (byte b : bytes) {
            String hex = String.format("%02x", b);
            hexString.append(hex);
        }
        return hexString.toString();
    }
}

 

 

 

https://www.baeldung.com/sha-256-hashing-java

'ETC' 카테고리의 다른 글

gRPC  (0) 2024.09.10