메시지 인증 코드
IT 위키
더 많은 작업
- Message Authentication Code
- 메시지의 무결성(integrity)과 메시지 인증(authentication)
- 자신에게 도착한 메시지가 송신자가 보낸 그대로 인지를 확인할 수 있다
- 메시지 인증코드로 막을 수 있는 것들
- H가 A인척하고 B에게 메시지를 보낸다.
- A가 B에게 보내는 메시지를 H가 중간에서 조작한다.
- (A가 B에게 보여준 메시지를 티 안나게 조작해서 다른 메시지를 보내는 경우도 포함)
앨리스가 밥에게 송금 의뢰 메시지를 전달하는 경우 가정
- 송신자 앨리스와 수신자 밥은 사전에 키를 공유해 둔다.
- 송신자 앨리스는 송금 의뢰 메시지를 기초로 해서 MAC 값을 계산한다(공유 키를 사용).
- 송신자 앨리스는 수신자 밥에게 송금 의뢰 메시지와 MAC 값을 보낸다.
- 수신자 밥은 수신한 송금 의뢰 메시지를 기초로해서 MAC 값을 계산한다(공유 키를 사용).
- 수신자 밥은 앨리스로부터 수신한 MAC 값과 계산으로 얻어진 MAC 값을 비교한다.
- 수신자 밥은 2개의 MAC 값이 동일하면 송금 의뢰가 틀림없이 앨리스로부터 온 것이라고 판단한다(인증 성공). 동일하지 않다면 앨리스로부터 온 것이 아니라고 판단한다(인증 실패)
- 공격 시나리오
- A가 B에게 보내는 송금의뢰 메시지와 메시지 인증 코드를 H가 가로챈다.
- H는 그 메시지와 메시지 인증 코드를 그대로 다시 전송함으로써 A가 아님에도 송금 요청을 할 수 있다.
- 해결방안
- 순서 번호(sequence number): 송신 메시지에 매회 1씩 증가하는 번호를 함께 전달
- 타임스탬프(timestamp): 송신 메시지에 현재 시각을 함께 전달
- 비표(nonce): 메시지를 수신하기에 앞서 수신자는 송신자에게 일회용의 랜덤한 값(비표) 전달
| 방식 | 기반 | 설명 |
|---|---|---|
| HMAC | 해시 함수 | 해시 함수(SHA-256 등)에 키를 두 번 섞어 계산한다. RFC 2104, FIPS 198-1. TLS, IPSec, JWT 등에서 널리 쓴다. |
| CBC-MAC | 블록암호 | 메시지를 CBC 모드로 암호화한 마지막 블록을 태그로 쓴다. 가변 길이 메시지에서는 위조가 가능해 단독 사용이 위험하다. |
| CMAC | 블록암호 | CBC-MAC의 약점을 보완하려고 마지막 블록에 서브키를 XOR한다. NIST SP 800-38B 권고 방식이다. |
| GMAC | 블록암호(GCM) | GCM 모드의 인증 부분(GHASH)만 사용한 MAC이다. 암호화 없이 인증만 할 때 쓴다. |
암호화와 인증을 한 번에 처리하는 인증 암호(AE) 방식으로 CCM, GCM이 있다. 자세한 모드는 블록암호 모드 참고.
- K'는 키를 해시 함수의 블록 크기(SHA-256은 64바이트)에 맞춘 값이다. 키가 블록보다 길면 먼저 해시하고, 짧으면 0으로 채운다.
- ipad는 0x36, opad는 0x5C를 블록 길이만큼 반복한 상수이다.
- 안쪽 해시와 바깥쪽 해시 두 번을 거치므로 단순히 H(K‖m)을 쓸 때 생기는 길이 확장 공격을 막는다.
| 구분 | 해시 함수 | MAC | 전자서명 |
|---|---|---|---|
| 키 | 없음 | 대칭키(공유 비밀키) | 개인키 서명, 공개키 검증 |
| 무결성 | 제공(변조 후 재계산 가능하므로 단독으로는 약함) | 제공 | 제공 |
| 출처 인증 | 제공 안 함 | 제공 | 제공 |
| 부인방지 | 제공 안 함 | 제공 안 함 | 제공 |
| 속도 | 빠름 | 빠름 | 느림 |
| 예 | SHA-256, SHA-3 | HMAC, CMAC, GMAC | RSA 서명, DSA, ECDSA |
- MAC은 무결성과 출처 인증을 제공하지만 대칭키를 공유하기 때문에 부인방지는 제공하지 않는다.
- HMAC 식의 ipad(0x36)와 opad(0x5C), 이중 해시 구조가 자주 출제된다.
- 재전송 공격은 MAC만으로 막을 수 없으며 순서 번호·타임스탬프·Nonce를 함께 쓴다.