인증 암호는 한 번에 두 가지를 돌려준다. 내용을 숨기는 암호문과, 수신자가 변조를 탐지할 수 있게 해 주는 태그다. 예전에는 이 기능들을 따로따로 조립했고, 잘못된 조합은 미묘한 고장을 낳았다. 현대의 구성은 조합 방식과 그것이 성립하는 조건을 규정한다. 여기서 인증이란 태그를 가리키며 사람을 가리키지 않는다.

두 보증은 보호된 패킷에만 적용되고 그 바깥의 무엇에도 적용되지 않는다.

하나의 구성에 담긴 두 보증

암호화는 관찰자가 이것을 읽을 수 있는지에 답한다. 무결성은 이것이 변조되었는지에 답한다. 터널에는 둘 다 필요하다. 변조된 내용은 읽을 수 없는 내용보다 나쁘다. AEAD는 인증되지만 암호화되지 않는 관련 데이터와 함께, 두 가지를 하나의 키 아래에서 어떻게 결합하는지 정한다. 수신자는 검사를 통과하지 못한 입력을 거부한다.

관련 데이터는 보이는 필드를 검사에 묶는다. 어떤 필드가 그렇게 되는지는 프로토콜에 달려 있으며, 바깥 주소가 모두 비밀이 되었다는 약속은 아니다. 필드는 태그로 덮인 채 네트워크에서 여전히 읽힐 수 있다.

논스는 사소한 세부가 아니다

키와 논스는 올바르게 다루어야 하며, 논스의 재사용은 온화하게 실패하지 않는다. 같은 키 아래에서 논스를 반복하면 메시지 사이의 관계가 드러나고 무결성 보증이 뿌리째 흔들린다. 그래서 논스의 생성과 순서는 애플리케이션이 아니라 프로토콜이 맡는다.

이것은 보증의 조건이지 구현에 대한 조언이 아니다. 부주의한 논스는 광고된 성질을 주지 않는다.

재전송 보호는 별개의 상태다

태그가 온전하더라도 유효한 오래된 패킷은 재전송될 수 있다. 태그가 증명하는 것은 진위이고 신선도가 아니기 때문이다. 재전송 처리는 자기만의 상태를 요구한다. 시퀀스 번호, 윈도, 무엇을 받아들일지에 대한 규칙이다. 그 상태는 프로토콜 구현 안에 살고 암호 선택과는 무관하다. 강한 암호화가 있어도 재전송 보호가 없는 터널은 어제의 트래픽을 여전히 받아들인다.

두 메커니즘은 하나가 아니면서 협력하고, 하나가 옳아도 다른 하나가 빠질 수 있다.

태그가 말해 주지 않는 것

상대의 신원은 인증서나 미리 공유한 키로 성립하며, 암호가 인증되었기 때문에 성립하는 것이 아니다. 경로, 이름 해석, 운영자의 기록 정책은 암호 경계 밖에 있다. 알고리즘 협상이 성공했다는 것은 양 끝이 한 스위트에 합의했다는 뜻일 뿐이며, 그것은 호환성의 문제이고 어느 쪽 구현의 품질의 문제가 아니다.

사용자에게 실용적인 지침은 유지·지원되는 프로토콜 구성을 고르라는 것이다. AEAD는 그 구성의 성질이며, 터널 둘레에 암호를 손으로 짜라는 초대가 아니다.

어떤 스위트가 협상되었는지, 재전송 보호가 활성인지, 상대를 어떻게 식별하는지 기록하라. 세 가지 사실, 세 가지 다른 보증이다.

관련 글