[Java] Mac class

2022. 1. 13. 23:21개발공부/Java

728x90

Javax.crypto.Mac 클래스

Mac class

Javax Mac 클래스는 MAC(Message Authentication Code) 알고리즘 기능을 제공해줍니다.

MAC은 서로 공유하는 secret key가 있을 때, 전송되는 정보의 유효성을 검증하고 요청에 대한 응답을 처리해주기 위해 사용됩니다.

따라서 MAC은 secret key를 기반으로 전송되는 데이터들에 대한 보안 기능을 한다고 볼 수 있습니다.

MAC의 메커니즘은 암호화 해시기능에 기반하는데, 이러한 매커니즘을 HMAC이라고 합니다. HMAC은 어떤 해시기능 (e.g., SHA256, SHA384)과도 같이 사용하며, secret key와 조합해서 사용합니다.

[위 내용은 아래 참고자료(Java docs)를 번역한 내용입니다.]

예제코드

아래는 Baeldung 사이트에서 발췌한 HMAC을 생성하기 위해 Mac 클래스를 사용하는 예제코드입니다.

secretKey와 algorithm을 사용해 Mac 클래스를 initialize 해주고, doFinal()로 HMAC(해싱)을 수행해줍니다. doFinal()은 HMAC 결과로 byte array를 리턴해줍니다.

그리고 bytesToHex()라는 메서드를 실행하는데 보통 HMAC 결과를 Hex로 인코딩 해줘서 사용하기 때문에 데이터 인코딩을 수행하는 메서드라고 보시면 될 것 같습니다.

(참고) Encoding(인코딩)은 왜 해야할까?

The purpose of encoding is to transform data so that it can be properly (and safely) consumed by a different type of system, e.g. binary data being sent over email, or viewing special characters on a web page. The goal is not to keep information secret, but rather to ensure that it’s able to be properly consumed. Encoding transforms data into another format using a scheme that is publicly available so that it can easily be reversed. It does not require a key as the only thing required to decode it is the algorithm that was used to encode it.


public static String hmacWithJava(String algorithm, String data, String secretKey)
  throws NoSuchAlgorithmException, InvalidKeyException {
    //algorithm = HmacSHA256,...
    SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(), algorithm);
    Mac mac = Mac.getInstance(algorithm);
    mac.init(secretKeySpec);
    return bytesToHex(mac.doFinal(data.getBytes()));
}

참고자료

'개발공부 > Java' 카테고리의 다른 글

[Regex] Pattern and Matcher in Java  (0) 2022.01.21
[Java] main 메서드  (0) 2022.01.15
[JPA] @Embedded 와 @Embeddable  (0) 2021.10.08
[Supplier] What is Java 8 Supplier interface?  (0) 2021.09.11
[Builder] 생성자 어노테이션  (0) 2021.09.05