HMAC란?
해싱 기법을 적용하여 메시지의 위변조를 방지하는 기법을 HMAC (Hash-based Message Authentication) 이라고 한다. 좀더 상세히 설명하면 Sender와 Recipient는 서로 API를 주고 받아야한다. 그럴때 이메시지가 Sender 가보낸 메시지인지 인증을 해야한다. 뿐만 아니라 이 메시지가 변조가 되었는지 확인을 해야한다. 이러한 문제점을 해결하는것이 HMAC이다. Sender는 메시지를 보내기전에 공유된 Secret키와 메시지를 기반으로 해쉬값을 만든다. 그리고 이해쉬값을 헤더값에 포함하여 전달해준다. 그리고 Recipient는 그 받은 메시지를 기반으로 또 자신이 가지고있는 공유된 Secret를 이용하여 해쉬를 만들어내고 헤더값에 넘어온 키를 대조한다. 이것이 일치하면 Sender에대한 인증, 메시지의 무결성을 확인할 수 있다.
만약 중간에 해커가 메시지를 가로챈다고 하더라도 시크릿키를 알수 없기때문에 메시지를 변조할 수 없다. 그리고 보통 메시지 Body값에는 Timestamp를 넣는것이 일반적이다. 이렇게하면 서버에서 호출시간을 알 수 있고 이렇게 함으로써 좀더 보안성을 높여 사용할 수 있다. 아래는 HMAC의 예제 그림이다.
HMAC Example(Java)
다음은 자바 소스를 이용한 예제이다. 다음은 SHA-256알고리즘을 이용하여 해쉬를 만든것이다. 그안에서 인코딩방법* 16진수방법과 base64 방법이 존재한다.
public class HMACAuthentication {
public void verifySignature(String secret, String payload, String signature) {
try {
final String resultHex = getHexHash(secret, payload);
if (!resultHex.equals(signature))
throw new RuntimeException("HMAC does not match.");
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private String getHexHash(String secret, String payload) throws NoSuchAlgorithmException, InvalidKeyException {
final String hmacSHA256 = "HmacSHA256";
final Mac hasher = Mac.getInstance(hmacSHA256);
hasher.init(new SecretKeySpec(secret.getBytes(), hmacSHA256));
final byte[] hash = hasher.doFinal(payload.getBytes());
// String resultBase = DatatypeConverter.printBase64Binary(hash); // to base64
return DatatypeConverter.printHexBinary(hash).toLowerCase(); // to hex
}
}
'Industry 4.0 > APIs' 카테고리의 다른 글
침투 테스트란? | 펜 테스트란? (0) | 2023.09.18 |
---|---|
What are webhooks? (0) | 2021.05.12 |
Best Practices for Designing a Pragmatic RESTful API (1) | 2021.02.22 |
메시지큐(Message Queue) 알아보기 (0) | 2020.10.19 |
Using variables - Postman (0) | 2020.08.07 |
댓글