✎NHN Academy | JAVA

NHN Academy - 2024.12.11(Wed)

박순돌 2024. 12. 11. 09:52

HMAC - Hash-based Message Authentication Code

: 암호화 해시 함수와 기밀 암호화 키를 수반하는 특정한 유형의 메시지 인증 코드(MAC)

: 해시 함수와 비밀 키를 결합하여 메시지의 무결성을 검증하고, 메시지가 변경되지 않았음을 확인하는 데 사용

: 메시지를 암호화 X

: HMAC 해시와 함께 송신

: 기밀 키를 가진 쌍방은 스스로가 다시 메시지를 해싱하게 되며 진본인 경우 수신 후 연산되는 해시가 일치

 

HMAC의 동작 원리

HMAC은 기밀 키 해시 함수를 사용해서 인증 코드를 생성함

  1. 키 준비:
    • 비밀 키가 해시 함수의 블록 크기보다 길면, 키를 해시해서 적당한 길이로 만듦
    • 비밀 키가 블록 크기보다 짧으면, 키를 패딩해서 블록 크기와 맞춤
  2. 패딩 적용:
    • outer pad inner pad를 생성
    • inner pad = 키와 특정 상수(0x36)를 XOR 연산한 값, outer pad = 키와 다른 상수(0x5c)를 XOR 연산한 값
  3. 해시 연산:
    • 내부 해시 : 1번째 해시 연산은 (key ⊕ ipad) + message
    • 외부 해시 : 2번째 해시 연산은 (key ⊕ opad) + (내부 해시)

최종적으로 생성된 값이 바로 HMAC

 

HMAC의 목적

  1. 무결성 검증:
    • HMAC을 사용하면 메시지가 전송 중에 변경되지 않았는지 확인할 수 있음.
    • 만약 메시지가 변경되면, 계산된 HMAC 값이 달라져서 이를 감지할 수 있음.
  2. 인증:
    • HMAC은 메시지가 특정 송신자에게서 온 것인지 확인하는 데 사용됨.
    • 비밀 키를 아는 사람만 HMAC을 생성할 수 있기 때문에, 메시지의 발신자를 인증할 수 있음.

 

HMAC 예시

HMAC_SHA256("key", "The quick brown fox jumps over the lazy dog") 실행 결과

   ➔ f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8      이 값이  HMAC-SHA256 값!

 

같은 메시지에 같은 비밀 키를 사용하면, 항상 동일한 HMAC 값이 나오기 때문에 메시지가 변조되지 않았음을 확인 가능 O

 

HMAC의 보안 : 해시 함수 비밀 키에 의존

  • 사용되는 해시 함수는 충돌 회피와 저항성이 강할 것     EX, SHA-256 같은 강력한 해시 함수를 사용하는 것이 좋음
  • 비밀 키는 외부에 유출되지 않도록 철저히 관리할 것     EX, 키가 유출되면 메시지를 위조할 수 있음.
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class HMACExample {
    public static void main(String[] args) {
        // 비밀 키와 메시지
        String key = "key";
        String message = "The quick brown fox jumps over the lazy dog";

        try {
            // HMAC-SHA256을 사용할 것임
            Mac mac = Mac.getInstance("HmacSHA256");
            
            // 비밀 키를 바이트 배열로 변환
            SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "HmacSHA256");

            // Mac 객체 초기화
            mac.init(secretKeySpec);

            // 메시지 바이트 배열로 변환
            byte[] messageBytes = message.getBytes();

            // HMAC 계산
            byte[] hmacBytes = mac.doFinal(messageBytes);

            // 결과를 Base64로 인코딩하여 출력
            String hmac = Base64.getEncoder().encodeToString(hmacBytes);
            System.out.println("HMAC: " + hmac);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


출력 결과 :
HMAC: jg8y+g70jE5z6a4DkBFSjXjJ8pmfD2nHqYYW5CugIu0=

코드 설명:

  1. Mac.getInstance("HmacSHA256"):
    • Mac 객체를 생성할 때, HmacSHA256 해시 알고리즘을 사용하여 HMAC을 생성
    • HmacSHA256을 사용하면 SHA-256을 기반으로 HMAC을 생성 가능 O
    • 다른 해시 알고리즘을 사용할 경우 "HmacSHA1"이나 "HmacMD5"와 같이 변경 가능 O
  2. SecretKeySpec:
    • SecretKeySpec 객체는 HMAC에 사용할 비밀 키를 지정하는 클래스
    • 비밀 키는 getBytes()를 통해 바이트 배열로 변환되며, HMAC 알고리즘이 사용하는 키 형태로 지정
  3. mac.init(secretKeySpec):
    • Mac 객체에 비밀 키를 초기화하여 HMAC을 계산할 준비
  4. mac.doFinal(messageBytes):
    • doFinal() 메서드는 지정한 메시지 바이트 배열을 기반으로 HMAC을 계산하고 그 결과를 반환
  5. Base64.getEncoder().encodeToString(hmacBytes):
    • 결과 HMAC 바이트 배열을 Base64로 인코딩하여 읽을 수 있는 문자열 형식으로 출력

 

 

예시 -> 8비트 ASCII / UTF-8 인코딩 사용, 일부 비어있지 않은 HMAC

HMAC_MD5("key", "The quick brown fox jumps over the lazy dog")    = 80070713463e7749b90c2dc24911e275
HMAC_SHA1("key", "The quick brown fox jumps over the lazy dog")   = de7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9
HMAC_SHA256("key", "The quick brown fox jumps over the lazy dog") = f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8

 

 

 


 

 

 

가지를 나누어 사용하는가?

 

1. 서로 다른 역할

Object Storage

 : 파일 저장에 최적화된 시스템으로, 이미지를 포함한 대량의 데이터를 효율적으로 저장하고 관리할 수 있도록 설계

 : 이미지를 저장하는 데 매우 효율적이지만, 이미지를 편집하거나 가공하는 기능은 제공하지 않음

Image Manager

 : 이미지를 처리하고 가공하는 데 특화된 시스템

   EX> 이미지의 크기를 조정하거나 변환하고, 썸네일을 생성하는 등의 작업을 자동화 O

 : 저장소 자체를 제공 X, 이미지를 저장하기 위한 다른 시스템(ex. Object Storage)과 함께 사용

 

2. 확장성 효율성

Object Storage

 : 데이터를 대량으로 저장하고, 확장성과 내구성에 중점을 둡니다. 대량의 이미지를 저장하는 데 매우 유리

Image Manager

 : 이미지 처리에 특화되어, 리사이징, 압축, 포맷 변환 등의 작업을 최적화하여 웹에서 빠르게 로드될 수 있도록 도움

 

별도 관리 필요

Object Storage

 : 단순히 이미지 파일을 저장하고 백업하는 데 사용

Image Manager

 : 이미지의 저장과 다양한 처리가 가능 O

   EX> 웹에서 이미지를 빠르게 로드(크기 최적화, 이미지 크기 동적 변환)

 

결론

  • Object Storage : 이미지 저장과 관련된 기본적인 기능을 제공하며, 대량의 이미지를 효율적으로 관리하는 데 유용
  • Image Manager : 이미지 처리 최적화에 특화된 시스템으로, 이미지를 웹에서 잘 표시될 수 있도록 가공하고, 관리하는 데 필요한 기능을 제공

2가지 시스템을 이미지의 저장과 처리라는 서로 다른 역할을 위해 함께 사용하는 경우가 많음!

   EX) Object Storage에 이미지를 저장, Image Manager를 통해 이미지 리사이징이나 최적화, 포맷 변환 등을 수행

'✎NHN Academy | JAVA' 카테고리의 다른 글

NHN Academy - 2024.12.04(Wed)  (1) 2024.12.04
NHN Academy - 2024.12.03(Tue)  (0) 2024.12.03
NHN Academy - 2024.11.27(Wed)  (2) 2024.11.27
NHN Academy - 2024.11.26(Tue)  (1) 2024.11.26
NHN Academy - 2024.11.25(Mon)  (1) 2024.11.25