프로토콜 데모 P-256 ECDH → MAC 비교 4부작 중 3부 · 서버 검증

DID Auth: 서버

서버 쪽. 자신의 개인키로 MAC을 다시 계산해 클라이언트가 보낸 MAC과 비교한다.

프로토콜 설명용 예제이며 실서비스에서 사용하지 마십시오. 표시된 키는 공개 데모 키입니다.

앱에서 열기 .ncw 내려받기

DID Auth: 서버

개요 및 암호학적 배경

이 워크플로우는 4부작 DID Auth 학습 모음의 3부입니다(키쌍 → 클라이언트 → 서버 → 종단 간 데모). 서버는 클라이언트의 65바이트 P-256 공개키와 8바이트 응답 Received MAC을 받으면, 자신의 32바이트 Server Private Key와 Client Public Key로 ECDH를 수행합니다.

타원곡선 스칼라 곱셈은 교환 가능하므로([dserver]Qclient = [dserver·dclient]G = [dclient]Qserver) 서버도 정확히 같은 32바이트 공유 비밀을 얻습니다. SHA-256(Z)를 같은 16바이트 AES 키와 16바이트 IV로 나누고, 자신이 낸 32바이트 챌린지 Nonce를 암호화해 기대되는 8바이트 MAC을 잘라 낸 다음, Value Comparator로 Received MAC과 비교합니다.

파이프라인 배선 구조와 단계별 흐름

ECDH (P-256) ──► SHA-256 → Key / IV ──► AES-128-CBC → Expected MAC (8B) ──► Value Comparator (== Received MAC) ──► Verified (true)
  1. 공유 비밀 재구성(ECDH Key Agreement): Server Private Key와 Client Public Key로 32바이트 P-256 공유 비밀을 계산합니다.
  2. 기대 MAC 재계산(SHA-256 → Byte Slicer × 2 → AES-128-CBC → Byte Slicer): 32바이트 챌린지 Nonce에 대한 8바이트 MAC 39b415c1dfeb8f52를 다시 만듭니다.
  3. 판정(Value Comparator): 다시 계산한 8바이트 조각(a)을 Received MAC(b)과 연산자 ==로 비교해 Verified = true를 출력합니다. 이 비교는 학습용 그래프의 값 비교일 뿐이며, 실제 서버에서는 상수 시간 비교를 써야 합니다.

노드 구성 및 설정

노드역할과 주요 매개변수개수
Workflow InputServer Private Key, Client Public Key, Nonce, Received MAC 공급1
ECDH Key Agreementcurve = "p256", format = "raw_x"1
Cryptographic Hashalgorithm = "SHA-256"1
Byte Slicer세 인스턴스: Key(0, 16), IV(16, 16), MAC(-16, 8)3
AES Encrypt이름 AES-128-CBC. mode = "CBC", padding = "None"으로 설정1
Value Comparator이름 MAC matches. operator = "=="으로 설정1
Workflow Output불리언 판정 Verified 출력1

노드 레퍼런스 →

입출력 명세 및 시험 벡터 검증

검증 출처: independent implementation: Node crypto (reference/did-auth/did-auth.mjs), no published vector

공개된 시험 벡터가 없어, Node crypto로 작성한 독립 구현(reference/did-auth/did-auth.mjs)과 결과를 대조했습니다.

입력

이름타입값 (Hex)
Server Private Keybytes (32 B)a4b87f7821ada85b4e7f63618924b4c3f3bbb78cddcab485a7ee6f15fdfc7261
Client Public Keybytes (65 B)0415dc193b8e2a688d603303e85ec8fcc15dcba44ef2156a128c386b66b4f5e1d2188e7ca9d0385c02e72c6899f2771e86bb017a2d2903d89a2892c2199aec8f4d
Noncebytes (32 B)000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f
Received MACbytes (8 B)39b415c1dfeb8f52

기대 출력

이름타입Value
Verifiedbooltrue