기술 포스트
MAC 명령어의 구조
ID TECH의 많은 고객사들은 P2PE(Point-to-Point Encryption)에 관심을 가지고 있으며, PCI의 엄격한 P2PE 규정을 준수하기 위한 노력의 일환으로 SRED(Secure Reading and Exchange of Data) 결제 단말기 도입을 검토하는 경우가 많습니다. 이러한 단말기는 데이터 수집 시점에서 암호화를 수행할 뿐만 아니라(ID TECH의 모든 단말기가 이 기능을 지원합니다), 위·변조 탐지, 위·변조 발생 시 자동 데이터 초기화, 그 밖의 특수 보안 기능도 함께 갖추고 있습니다.
이러한 "특수 보안 기능" 중에서도 가장 핵심적인 것이 바로 명령어에 대한 MAC 인증입니다.
암호학에서 MAC(Message Authentication Code)이란 수신자가 메시지를 인증할 수 있도록, 즉 해당 메시지가 신뢰할 수 있는 발신자로부터 전송되었음을 확인할 수 있도록 사용되는 짧은 코드입니다. MAC 값은 메시지와 송·수신자 양측이 공유하는 비밀 키를 결합함으로써 메시지의 데이터 무결성과 진위성을 모두 보호합니다. 메시지는 평문으로 전송되지만, 동시에 비밀 키가 암호화된 형태로 포함된 메시지+MAC도 함께 전송됩니다. 동일한 비밀 키를 보유한 누구든 해당 메시지(및 추가된 MAC 내용)가 같은 키에 접근 권한을 가진 상대방으로부터 왔는지 여부를 확인할 수 있습니다.
ID TECH의 SRED 기반 카드 리더기에서는 특정 민감한 명령어가 MAC으로 보호됩니다. 이는 단말기에 이미 저장된 키를 통해 검증 가능한 MAC 해시가 명령어와 함께 전달되지 않으면, 단말기가 해당 명령어를 실행하지 않는다는 것을 의미합니다. 명령어를 전송하는 측은 단말기가 검증에 사용할 키와 동일한 키를 이용하여 MAC 해시를 생성해야 합니다.
예시를 통해 좀 더 명확하게 이해할 수 있습니다.
ID TECH Augusta S 카드 리더기(SRED 디바이스)에서 날짜와 시간을 설정하는 경우를 예로 들어 보겠습니다. "날짜 및 시간 설정" 명령은 민감한 명령으로 분류됩니다. 권한 없는 당사자가 거래 날짜를 임의로 변경하거나 조작하는 것을 방지해야 하기 때문입니다. (그 밖의 "민감한" 명령으로는 화이트리스트에 카드를 추가하거나 제거하는 명령, 또는 디바이스의 인증서 폐지 목록(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이 하위 21비트로 구성된 카운터를 포함하는 10바이트 값이며, 사용할 때마다 해당 카운터가 증가한다는 것을 알고 있을 것입니다. 한 가지 간과하기 쉬운 점은, 장치에 여러 개의 DUKPT 키(예: 데이터, MAC, PIN용)가 포함된 경우 각 키마다 별도의 KSN이 할당되어 서로 독립적으로 증가한다는 것입니다. KSN은 공개 값이므로, ID TECH의 Augusta에서 언제든지 완전히 포맷된 명령어 02090078463e040005010000000603을 사용하여 MAC KSN을 쿼리할 수 있습니다.
KSN은 사용 시마다 고유하게 생성되는(따라서 재전송 공격에 취약하지 않은) MAC 키 계산에 사용되므로 매우 중요합니다. 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-prime)는 동일한 키를 총 64바이트 길이가 되도록 우측에 0으로 채운(zero-padded) 값을 의미합니다.
ipad (inner pad)는 단순히 상수 36363636…을 64바이트 길이가 되도록 반복한 값입니다.
K' ⊕ ipad 는 0으로 채운 키와 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을 사용하여 SHA-256 방식으로 32바이트 MAC 해시를 생성할 수 있습니다. 폼 상단의 드롭다운 메뉴에서 "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에 대해 궁금한 점이 있으신가요? 전문가에게 문의하세요. 언제든지 도움을 드리겠습니다:
