기술 포스트
MAC 명령어의 구조
ID TECH의 많은 고객들이 단말기 간 암호화(P2PE)에 관심을 보이고 있으며, PCI의 엄격한 P2PE 규정을 준수하기 위한 노력의 일환으로 SRED(Secure Reading and Exchange of Data) 결제 단말기를 검토하는 경우가 많습니다. 이러한 단말기는 데이터 캡처 시점에서 암호화를 수행하는 것(ID TECH의 모든 단말기가 지원하는 기능)은 물론, 변조 감지, 변조 발생 시 자동 데이터 초기화(Zeroization), 그 밖의 다양한 특수 보안 기능도 갖추고 있습니다.
이러한 "특수 보안 기능" 가운데 가장 핵심적인 것이 바로 명령어에 대한 MAC 인증입니다.
암호학에서 메시지 인증 코드(MAC)란, 메시지 수신자가 해당 메시지의 출처를 인증하는 데 사용하는 짧은 코드입니다. 즉, 메시지가 신뢰할 수 있는 발신자로부터 전송되었음을 확인하는 수단입니다. MAC 값은 메시지를 발신자와 수신자 모두가 알고 있는 비밀 키와 결합함으로써 데이터 무결성과 진위 여부를 동시에 보호합니다. 메시지 자체는 평문으로 전송되지만, 비밀 키가 암호화된 형태로 포함된 메시지+MAC도 함께 전송됩니다. 동일한 비밀 키를 보유한 누구든 해당 메시지(및 포함된 MAC 내용)가 같은 키를 가진 다른 당사자로부터 전송된 것인지 확인할 수 있습니다.
ID TECH의 SRED 기반 카드 리더기에서는 일부 민감한 명령어가 MAC으로 보호됩니다. 즉, 단말기에 이미 저장된 키를 사용하여 검증 가능한 MAC 해시가 함께 전송되지 않으면 해당 명령어가 실행되지 않습니다. 명령어를 전송하는 측은 단말기가 검증에 사용할 키와 동일한 키로 MAC 해시를 생성해야 합니다.
다음 예시를 통해 보다 쉽게 이해할 수 있습니다.
예를 들어, SRED 단말기인 ID TECH Augusta S 카드 리더기의 날짜와 시간을 설정하려는 경우를 가정해 보겠습니다. "날짜 및 시간 설정" 명령어는 민감한 명령어로 분류됩니다. 권한이 없는 제3자가 거래 일자를 소급하거나 임의로 변경하는 행위를 방지해야 하기 때문입니다. 이 밖에도 화이트리스트에 카드를 추가하거나 삭제하는 명령어, 또는 단말기의 인증서 폐기 목록(CRL)을 수정하는 명령어 등이 "민감한" 명령어에 해당합니다.
일반적으로 비SRED Augusta의 날짜 및 시간은 펌웨어 명령 78 53 01 50에 페이로드 길이(0x08), 날짜/시간 길이(0x06), 6바이트의 날짜 및 시간(YY MM DD HH MM SS 형식), 그리고 "MAC 길이"(비SRED 장치의 경우 0)를 순서대로 추가하여 설정합니다. Augusta S의 경우 동일한 형식을 사용하되, 페이로드 길이는 0x26이고 "MAC 길이"는 0x1E입니다. 이는 30바이트의 "MAC 페이로드"가 끝에 추가되기 때문입니다.
Augusta를 사용할 때는 전체 명령을 ID TECH의 NGA 프로토콜 형식에 맞게 구성해야 합니다. 이는 명령 구조 앞에 STX(0x02)와 리틀 엔디언 방식의 2바이트 길이 값을 추가하고, 명령 구조 뒤에 LRC, 체크섬, ETX(0x03)를 추가하는 방식입니다. MAC이 적용된 최종 명령 전체는 다음과 같습니다(명령 바이트는 노란색으로 표시):
02 2B 00 78 53 01 50 26 06 17 11 10 09 15 00 1E 10 00 4E C7 DF CF 04 D3 3C C6 EC 6F 50 92 00 86 A1 DD 0A 00 62 99 49 00 00 00 00 00 00 02 EB F9 03
각 섹션별로 분석하면 다음과 같습니다:
02 는 STX입니다.
2B 00 는 LRC/체크섬/ETX 트레일러를 제외한 전체 구조의 (리틀 엔디언) 길이입니다.
78 53 01 50 는 날짜 및 시간 설정 펌웨어 명령입니다.
26 는 (16진수) 이후 38바이트의 페이로드가 이어짐을 의미합니다.
06 는 날짜/시간이 6바이트로 구성됨을 의미하며, 내용은 다음과 같습니다:
17 11 10 09 15 00 — 2017년 11월 10일 오전 09:15:00.
1E 는 30바이트의 MAC 페이로드가 뒤따름을 의미합니다.
10 00 는 16의 리틀 엔디언 길이 값입니다(ID TECH MAC 해시는 모두 16바이트이기 때문입니다).
4E C7 DF CF 04 D3 3C C6 EC 6F 50 92 00 86 A1 DD 는 16바이트 MAC 해시, 즉 "HMAC"입니다.
0A 00 는 뒤따르는 KSN에 대한 리틀 엔디언 길이 값 10입니다.
62 99 49 00 00 00 00 00 00 02 는 MAC KSN입니다.
EB 는 종방향 중복 검사(LRC) 값입니다.
F9 는 78부터 최종 KSN 바이트(02)까지의 모든 데이터에 대한 8비트 체크섬입니다.
03 는 ETX(전송 종료)입니다.
이 명령을 구성하는 것 자체는 특별히 어렵지 않습니다. 직관적으로 이해하기 어려운 부분은 KSN과 HMAC(해시 자체)입니다.
MAC KSN
MAC KSN(키 일련 번호)은 필요한 시점에 디바이스에 직접 쿼리하여 얻어야 하는 값입니다. ANSI X9.24-1(트랜잭션별 고유 파생 키 표준)에 익숙하다면, KSN이 10바이트 값이며 하위 21비트가 사용할 때마다 증가하는 카운터로 구성된다는 것을 알고 계실 것입니다. 한 가지 놓치기 쉬운 점은, 디바이스에 여러 개의 DUKPT 키(예: 데이터용, MAC용, PIN용)가 포함된 경우 각 키마다 별도의 KSN이 할당되며, 이 KSN들은 서로 독립적으로 증가한다는 것입니다. 다만 KSN은 공개 값이므로, ID TECH의 Augusta에서는 02090078463e040005010000000603 형식의 완성된 명령을 언제든지 전송하여 MAC KSN을 조회할 수 있습니다.
KSN은 중요한 역할을 합니다. MAC 키 계산에 사용되며, MAC 키는 사용 시마다 고유하게 생성되기 때문에 재전송 공격(replay attack)에 취약하지 않습니다. KSN 및 DUKPT 키 파생에 대한 자세한 내용은 해당 주제를 다룬 이전 2부작 포스트.
HMAC 파생
이제 본격적인 기술적 내용으로 들어가겠습니다.
HMAC( RFC 2104참조)는 다음 요소를 활용하여 MAC 해시를 생성하는 업계 표준 방식입니다:
- — 128비트 일회용 키
- — 임의의 메시지 페이로드
- — SHA-256 해싱
해당 키는 표준 DUKPT 규칙에 따라 MAC KSN과 장치의 IPEK(이는 다시 BDK에서 파생됨)를 사용하여 동적으로 도출됩니다. 이 규칙은 데이터 키나 PIN 키와는 구별되는 MAC 키 도출 방식을 정의하고 있습니다. 자세한 내용은 이전에 작성한 2부작 게시물
HMAC 해시는 다음과 같이 다소 복잡해 보이는 공식에 따라 계산됩니다.
H( (K' ⊕ opad) ‖ H( (K' ⊕ ipad) ‖ m) )
어렵게 느껴질 수 있지만, 실제로는 충분히 이해할 수 있는 내용입니다. K 는 128비트 키입니다. K' (K 프라임)은 동일한 키를 총 64바이트 길이가 되도록 0으로 패딩한 값입니다.
ipad (inner pad)은 단순히 36363636…을 64바이트 길이로 반복한 상수값입니다.
K' ⊕ ipad 는 제로 패딩된 키와 ipad 값을 배타적 논리합(XOR)으로 결합하는 연산을 의미합니다. XOR은 컴퓨터 과학 분야에서 널리 활용되는 비트 단위 산술 연산입니다.
K' ⊕ ipad) ‖ m 는 위에서 구한 값에 메시지(m)를 덧붙이는 것을 의미합니다. 단순히 바이트를 끝에 이어 붙이면 됩니다. (이 시점에서 전체 길이가 64바이트를 초과하더라도 문제없습니다.)
H( (K' ⊕ ipad) ‖ m) 는 괄호 안의 전체 값에 해시 함수(여기서는 SHA-256)를 적용하는 것을 의미합니다.
해당 단계가 완료되면, 그 결과값을 K' ⊕ opad에 덧붙입니다. 여기서 opad(outer pad)는 5C5C5C5C…를 64바이트 길이로 반복한 상수값입니다. 이후 전체 값에 대해 해시 연산을 한 번 더 수행합니다.
참고로, ipad와 opad 값은 이 알고리즘의 원래 고안자들이 임의로 선택한 것이지만, 해시의 앞뒤 두 절반 사이의 해밍 거리(비트 단위 차이)를 최대화하도록 설계되었습니다. 해시를 중첩 구조로 두 번 나누어 수행하는 방식은 다양한 형태의 스푸핑 공격을 방지하기 위한 것입니다.
HMAC 값 생성을 돕기 위해, ID TECH는 온라인 HTML 폼을 게시했습니다. 여기이 폼에서 KSN과 BDK(루트 키) 값을 입력하고, MAC 키를 도출한 후, HMAC을 사용하여 32바이트 MAC 해시(SHA-256 방식)를 생성할 수 있습니다. 폼 상단의 드롭다운 메뉴에서 "Generate HMAC (with verbose output)" 옵션을 꼭 사용해 보십시오. HMAC의 각 구성 요소가 어떤 형태인지를 명확하게 설명하는 매우 유용한 상세 출력 추적 결과를 확인할 수 있습니다.
당사의 온라인 도구를 사용하여 KSN 값 62 99 49 00 00 00 00 00 00 02와 ANSI 표준 테스트 키인 루트 키(BDK) 0123456789ABCDEFFEDCBA9876543210으로 MAC 키를 생성하면, MAC 키 값은 3E4A480ACE8B239B9539E6053EAB03D9가 되어야 합니다. 해당 키를 사용하여 페이로드 78 53 01 50 26 06 17 11 10 09 15 00 1E 10 00에 HMAC 알고리즘을 적용하면, 32바이트 HMAC 해시가 생성되며, 그 중 첫 16바이트는 4EC7DFCF04D33CC6EC6F50920086A1DD입니다. (ID TECH는 첫 16바이트만 사용합니다.) 이것이 바로 날짜 및 시간 설정 명령에 추가될 "지문" 역할을 하는 핵심 값입니다. 카드 리더기는 평문 페이로드 바이트를 확인하고, 자체 KSN 및 내부 키 도출 코드를 사용하여 명령에 포함된 것과 동일한 HMAC 값을 산출함으로써, 해당 명령이 비밀 BDK(0123456789ABCDEFFEDCBA9876543210)를 알고 있는 출처, 즉 신뢰할 수 있는 출처에서 전송되었음을 검증합니다.
DUKPT, HMAC, SRED, P2PE에 대해 궁금한 점이 있으신가요? 당사 전문가에게 문의하십시오. 언제든지 도와드리겠습니다.
