메시지 인증 (Message Authentication)
메시지 인증(message authentication)은 받은 메시지가 주장된 발신자에게서 왔고 전송 중 바뀌지 않았음을 수신자가 확인하는 일입니다. 대표적인 수단은 공유 비밀 키로 만드는 메시지 인증 코드(MAC)와 개인 키로 만드는 디지털 서명입니다.
자세히 알아보기
MAC 방식에서는 발신자와 수신자가 같은 비밀 키를 공유합니다. 발신자는 키와 메시지로 짧은 인증 태그를 계산해 메시지에 붙이고, 수신자는 같은 키로 태그를 다시 계산해 비교합니다. 메시지가 바뀌었거나 키가 다르면 태그가 맞지 않습니다. 널리 쓰이는 HMAC(RFC 2104, 1997년)은 해시 함수 H로 H((K ⊕ opad) ‖ H((K ⊕ ipad) ‖ 메시지))(‖는 이어 붙이기)를 계산합니다.
디지털 서명 방식에서는 발신자가 자신의 개인 키로 서명하고, 수신자는 공개된 공개 키로 검증합니다. 검증하는 쪽은 서명을 만들 수 없으므로, 서명은 제3자에게도 그 개인 키 소유자가 메시지에 서명했다는 증거가 됩니다. 서명자가 나중에 서명 사실을 쉽게 부인할 수 없다는 이 성질을 부인 방지(non-repudiation)라고 합니다.
두 방식의 가장 큰 차이가 바로 부인 방지입니다. MAC은 수신자도 같은 키로 똑같은 태그를 만들 수 있으므로, 수신자 자신은 메시지가 키를 공유한 상대에게서 왔다고 확신할 수 있지만 제3자에게 누가 만들었는지 증명할 수는 없습니다. 따라서 MAC은 부인 방지를 제공하지 않습니다.
메시지 인증은 암호화와도 다른 개념입니다. 암호화는 내용을 숨기는 것이고, 어떤 키로 복호화가 되었다는 사실만으로 메시지가 변조되지 않았다고 볼 수는 없습니다. 기밀성과 인증을 함께 얻으려면 AES-GCM 같은 인증 암호(AEAD, RFC 5116)를 쓰는데, 이 방식은 암호문과 함께 인증 태그를 만들고 복호화할 때 태그를 검사해 변조된 데이터를 거부합니다.
블록체인·암호화폐에서는
블록체인 트랜잭션의 인증은 디지털 서명으로 이루어집니다. 비트코인과 이더리움의 노드는 트랜잭션에 붙은 서명을 공개 키로 검증해, 자금을 쓰려는 사람이 해당 개인 키를 가졌는지와 트랜잭션 내용이 바뀌지 않았는지를 확인합니다. 네트워크의 누구나 검증할 수 있어야 하므로, 비밀 키 공유를 전제로 하는 MAC은 이 용도에 맞지 않습니다.
MAC은 미리 키를 나눠 가진 두 당사자 사이에서 많이 쓰입니다. 예를 들어 업비트 API는 이용자가 발급받은 비밀 키로 서명한 JWT 토큰을 요청에 붙이게 하고, 이 서명에는 HMAC(권장 방식 HS512)이 쓰입니다. 거래소는 같은 비밀 키로 태그를 다시 계산해 요청이 키 소유자에게서 왔고 내용이 바뀌지 않았는지 확인합니다. 요청마다 새 일회용 값(nonce)을 넣게 하는 것은 가로챈 요청을 그대로 다시 보내는 재전송 공격을 막기 위해서입니다. 태그나 서명만으로는 같은 메시지가 두 번 오는 것을 구별할 수 없기 때문입니다.
쉽게 말하면
MAC은 가족끼리 정해 둔 확인 문구와 비슷합니다. 전화 너머 상대가 문구를 맞히면 가족임을 알 수 있지만, 가족 모두가 그 문구를 알기 때문에 바깥 사람에게 누가 말했는지 증명할 수는 없습니다. 디지털 서명은 인감 증명서가 첨부된 계약서에 가깝습니다. 누구나 대조해 볼 수 있고, 서명한 사람이 나중에 서명하지 않았다고 주장하기 어렵습니다.
이 글은 학습을 위한 일반 정보이며 투자 권유나 법률 자문이 아닙니다. 가상자산은 가격 변동이 크고 원금 손실 위험이 있습니다.