(Java) HmacUtils, Mac이 thread-safe하지 않다?
일반적으로 Hash, HMAC 만들 때는 아래 Util 클래스 사용한다.
1
2
org.apache.commons.codec.digest.DigestUtils
org.apache.commons.codec.digest.HmacUtils
그러나 HmacUtils은 thread-safe 하지 않다.
- 정확히는, HmacUtils는 thread-safe 하지만 그 안에서 사용되는 Mac이 thread-safe 하지 않다.
- 그래서 동시에 호출되는 경우 hmac 결과값이 잘못 반환 될 수 있다. (한 쪽의 결과값이 잘못되거나, 양 쪽 모두 결과값이 잘못 되거나.)
- 그럼 어떻게 써야 하나?
- https://waseemh.github.io/thread-safe-mac-calculation이런 식으로 clone해서 사용해도 되지만,
- 그냥 매번 HmacUtils을 생성(내부에서 Mac을 생성)해서 사용해도 생성 비용이 비싸지 않다. (1ms 미만으로 성능을 신경 쓸 만큼 차이가 나지 않는다.)
[!tip] 송신자 or 메시지 생성자 인증 2가지 방법
대칭키 : HMAC
비대칭키 : 서명
HMAC과 일반 hash의 차이
- HMAC은 메시지 무결성 검증과 송신자 인증을 위해서 사용하는데,
- 일반적인 hash 생성 할 때, static salt (또는 secret key)를 넣어서 hash를 하면, 결국 HMAC이랑 똑같은거 아닌가? 싶은 생각이 들 수 있다.
1
2
3
HmacUtils(HmacAlgorithms.HMAC_SHA_256, secretKey).hmacHex(message)
vs
DigestUtils.sha256Hex(message + secretKey)
- 단순 hash로도 같은 효과를 낼 수는 있지만, HMAC은 해시 함수의 구조적 약점을 보완하도록 설계되어 있어 더 안전하고, 표준화된 방법이다.
- HMAC은 키를 패딩하고 해시를 두번 돌리는 등 단순 해시 생성하는 방식과 차이가 있고, 이 것이 보안과 충돌 저항성을 강화해준다.
- 그래서
secretKey(비밀 salt)
를 넣어서 hash를 해야 한다면, HMAC 사용하는게 더 좋다.
This post is licensed under CC BY 4.0 by the author.