프라이버시 보존 자격증명 기술 비교
1. 개요
본 문서는 디지털 자격증명 시스템에서 사용되는 주요 프라이버시 보존 기술들을 비교 분석한다. W3C VC(BBS+), SD-JWT, ISO mDoc의 세 가지 자격증명 포맷과 이들의 기반이 되는 암호 기술, 그리고 Holder Binding 메커니즘을 다룬다.
2. 자격증명 포맷 비교
2.1 W3C VC + BBS+ (Data Integrity)
정의
W3C Verifiable Credentials 데이터 모델에 BBS+ 서명을 결합한 방식이다. JSON-LD 형식으로 데이터를 표현하며, 페어링 기반 암호학을 통해 강력한 프라이버시 기능을 제공한다.
핵심 특성
| 특성 | 설명 |
|---|---|
| 선택적 공개 | 서명된 속성 중 일부만 공개하면서 서명 유효성 증명 |
| 영지식 증명 | 원본 서명 없이 유효한 서명 보유 사실만 증명 |
| 비연결성 | 동일 자격증명의 반복 사용 간 연결 불가 |
| Predicate Evaluation | 값 자체를 공개하지 않고 조건 증명 (예: 나이 ≥ 19) |
선택적 공개 동작 원리
BBS+ 서명은 여러 메시지를 하나의 서명으로 묶는 다중 메시지 서명 방식이다.
서명 생성:
σ = Sign(sk, m₁, m₂, m₃, ..., mₙ)
선택적 공개 (m₂만 공개):
π = DeriveProof(σ, m₁, m₂, m₃, ..., reveal={m₂})
검증:
Verify(π, m₂) → true/false
검증자는 m₂의 값과 "유효한 서명이 존재함"만 알 수 있고, 다른 속성(m₁, m₃, ...)은 알 수 없다.
비연결성의 원리
매 제시마다 새로운 영지식 증명(π)이 생성된다. 이 증명에는 랜덤 요소가 포함되어 있어, 동일한 자격증명에서 파생되었더라도 두 증명 간의 연결이 수학적으로 불가능하다.
2.2 SD-JWT (Selective Disclosure JWT)
정의
기존 JWT 구조를 확장하여 선택적 공개를 지원하는 방식이다. IETF에서 표준화되었으며(RFC 9449), JWT 생태계와의 호환성이 높다.
핵심 특성
| 특성 | 설명 |
|---|---|
| 선택적 공개 | 해시+솔트 방식으로 속성별 공개 여부 결정 |
| 영지식 증명 | 미지원 |
| 비연결성 | 미지원 (Key Binding 시 동일 공개키 재사용) |
| Predicate Evaluation | 미지원 |
선택적 공개 동작 원리
SD-JWT는 해시 프리이미지 공개 방식을 사용한다.
발급 시:
{
"_sd": [
hash(salt₁ || "name" || "홍길동"),
hash(salt₂ || "age" || "25"),
hash(salt₃ || "address" || "서울시")
]
}
+ Disclosures:
~base64(salt₁, "name", "홍길동")
~base64(salt₂, "age", "25")
~base64(salt₃, "address", "서울시")
제시 시 (name만 공개):
JWT + ~base64(salt₁, "name", "홍길동")
검증:
hash(salt₁ || "name" || "홍길동") == _sd[0] → true
한계
속성을 공개하려면 실제 값을 그대로 전달해야 한다. 따라서 술어 증명("나이 ≥ 19")이 불가능하고, 공개된 값은 검증자가 완전히 알게 된다.
2.3 ISO mDoc (ISO/IEC 18013-5)
정의
모바일 운전면허증(mDL)을 위해 ISO/IEC에서 표준화한 규격이다. CBOR 형식을 사용하며, 하드웨어 기반 보안을 강조한다.
핵심 특성
| 특성 | 설명 |
|---|---|
| 선택적 공개 | MSO(Mobile Security Object) 내 Digest 대조 방식 |
| 영지식 증명 | 미지원 |
| 비연결성 | 제한적 (Batch Issuance로 완화 가능) |
| Predicate Evaluation | 미지원 (age_over_NN 같은 사전 계산된 속성으로 대체) |
선택적 공개 동작 원리
발급 시:
MSO = {
digestAlgorithm: "SHA-256",
valueDigests: {
"name": hash(salt₁ || "홍길동"),
"age": hash(salt₂ || "25"),
"address": hash(salt₃ || "서울시")
},
deviceKey: <Holder의 공개키>
}
+ IssuerSignature(MSO)
제시 시 (name만 공개):
MSO + IssuerSignature + { "name": (salt₁, "홍길동") }
검증:
1. IssuerSignature 검증
2. hash(salt₁ || "홍길동") == MSO.valueDigests["name"]
비연결성의 한계
MSO와 IssuerSignature가 정적이므로, 동일 자격증명을 여러 번 제시하면 추적이 가능하다. 이를 완화하기 위해 Batch Issuance(동일 내용의 자격증명을 여러 개 발급)를 사용한다.
3. 핵심 암호 기술
3.1 CL-Signature
정의
2001년 Jan Camenisch와 Anna Lysyanskaya가 제안한 서명 방식이다. Strong RSA 가정에 기반하며, 익명 자격증명 시스템의 초기 구현(Hyperledger Indy 등)에서 사용되었다.
수학적 구조
서명:
A = (a₀ · a₁^m₁ · a₂^m₂ · ... · aₙ^mₙ · v^vₑ)^(1/e) mod n
- m₁, m₂, ..., mₙ: 서명될 속성들
- e: 소수 지수
- n: RSA 모듈러스
특성
BBS+와 유사하게 선택적 공개, 영지식 증명, Predicate Evaluation을 지원한다. 다만 서명 크기가 크고 연산이 느리다는 단점이 있어, 최근에는 BBS+로 대체되는 추세이다.
3.2 BBS+ Signature
정의
타원곡선 페어링을 기반으로 한 서명 방식이다. CL-Signature와 동일한 프라이버시 기능을 제공하면서, 더 작은 서명 크기와 빠른 연산 속도를 가진다.
수학적 구조
서명:
σ = (A, e, s)
A = (g₁ · h₀^s · h₁^m₁ · h₂^m₂ · ... · hₙ^mₙ)^(1/(e+x))
- g₁, h₀, h₁, ..., hₙ: 타원곡선 상의 생성자
- x: 서명자의 비밀키
- e, s: 서명 관련 랜덤값
CL-Signature와 비교
| 구분 | CL-Signature | BBS+ |
|---|---|---|
| 수학적 기반 | RSA 그룹 | 타원곡선 페어링 |
| 서명 크기 | 큼 (~3KB) | 작음 (~100B) |
| 연산 속도 | 느림 | 빠름 |
| 주요 구현 | Hyperledger Indy | W3C VC Data Integrity |
3.3 Pedersen Commitment
정의
값을 숨긴 채로 해당 값에 바인딩하는 암호학적 기법이다. Link Secret 구현의 핵심 요소이다.
수학적 구조
정수 그룹:
C = g^s · h^r mod p
타원곡선 그룹:
C = s·G + r·H
- s: 숨기려는 값 (link_secret)
- r: 블라인딩 팩터 (랜덤값)
- g, h (또는 G, H): 공개된 생성자
핵심 속성
| 속성 | 설명 |
|---|---|
| 은닉성 (Hiding) | 커밋먼트 C만으로는 s의 값을 알 수 없음 |
| 바인딩 (Binding) | 커밋먼트 생성 후 s를 다른 값으로 바꿀 수 없음 |
3.4 Blinding vs Blinded Signature
두 용어 모두 "blind"를 사용하지만, 완전히 다른 개념이다.
Blinding (블라인딩)
Pedersen Commitment에서 랜덤값 r을 사용하여 실제 값 s를 숨기는 것을 말한다. 이는 커밋먼트 스킴 자체의 은닉 속성이다.
Blinded Signature (블라인드 서명)
서명자가 메시지 내용을 모른 채 서명하는 프로토콜이다.
1. Holder: m' = blind(m, r) ← 메시지 블라인딩
2. Holder → Signer: m' 전송
3. Signer: σ' = sign(m') ← 블라인드된 메시지에 서명
4. Signer → Holder: σ' 반환
5. Holder: σ = unblind(σ', r) ← 원본 메시지에 대한 유효한 서명 획득
비교
| 구분 | 블라인딩 (Pedersen) | 블라인드 서명 |
|---|---|---|
| 본질 | 커밋먼트의 속성 | 서명 프로토콜 |
| 목적 | 값을 숨긴 채 바인딩 | 서명자가 메시지 모른 채 서명 |
| 결과물 | 커밋먼트 값 | 유효한 서명 |
| 용도 | Link Secret 구현 | 익명 투표, 전자화폐 |
Link Secret 구현에서는 Pedersen Commitment의 블라인딩을 사용하며, Blinded Signature 프로토콜은 사용하지 않는다.
4. Holder Binding 메커니즘
4.1 정의
자격증명이 정당한 소유자에게 귀속되어 있음을 증명하는 메커니즘이다. Holder Binding이 없으면 자격증명 양도/도용이 가능해진다.
4.2 Link Secret 방식
W3C VC(BBS+) 및 CL-Signature 환경에서 사용한다.
발급 과정
1. Holder가 link_secret(s)을 생성 (한 번 생성 후 재사용)
2. Holder가 커밋먼트 C = commit(s, r)을 계산
3. Holder가 C와 "s를 알고 있다는 ZKP"를 Issuer에게 전송
4. Issuer가 C를 자격증명 속성에 포함하여 서명
5. Holder는 s 자체를 절대 공개하지 않음
이 과정에서 Issuer는 link_secret의 실제 값을 알 수 없다. 따라서 발급 시점에서도 부분적 프라이버시가 보장된다.
검증 과정
1. Holder가 자격증명의 유효한 서명을 보유하고 있음을 ZKP로 증명
2. Holder가 서명에 포함된 link_secret을 알고 있음을 ZKP로 증명
3. 검증자는 link_secret 값 자체는 알 수 없음
특성
| 장점 | 단점 |
|---|---|
| 비연결성 보장 | 구현 복잡도 높음 |
| 발급 시점 부분 프라이버시 | ZKP 연산 비용 |
4.3 Key Binding 방식
SD-JWT에서 사용한다.
발급 과정
1. Holder가 키 쌍(PK, SK) 생성
2. Holder가 공개키 PK를 Issuer에게 전송
3. Issuer가 PK를 cnf(confirmation) 클레임에 포함하여 서명
검증 과정
1. Holder가 SD-JWT 제시
2. Verifier가 챌린지(nonce) 발행
3. Holder가 SK로 챌린지 서명 → Key Binding JWT 생성
4. Verifier가 SD-JWT 내 PK로 Key Binding JWT 검증
특성
| 장점 | 단점 |
|---|---|
| 구현 단순 | 비연결성 없음 (동일 PK 재사용) |
| JWT 생태계 호환 | 발급 시점 프라이버시 없음 |
4.4 Device Binding 방식
ISO mDoc에서 사용한다.
발급 과정
1. Holder 기기의 Secure Element에서 키 쌍(PK, SK) 생성
2. PK를 Issuer에게 전송
3. Issuer가 PK를 MSO의 deviceKey에 포함하여 서명
검증 과정
1. Verifier가 Device Engagement 시작
2. Verifier가 챌린지 발행
3. Holder 기기가 SK로 챌린지 서명 (Secure Element 내에서)
4. Verifier가 MSO 내 deviceKey로 서명 검증
특성
| 장점 | 단점 |
|---|---|
| 하드웨어 보안 (키 추출 불가) | 비연결성 제한적 |
| 오프라인 검증 가능 | 기기 종속성 |
4.5 방식 비교
| 구분 | Link Secret | Key Binding | Device Binding |
|---|---|---|---|
| 비연결성 | 있음 | 없음 | 제한적 |
| 발급 시 프라이버시 | 부분적 | 없음 | 없음 |
| 하드웨어 보안 | 불필요 | 선택적 | 필수 |
| 구현 복잡도 | 높음 | 낮음 | 중간 |
| 적용 포맷 | BBS+, CL-Sig | SD-JWT | mDoc |
5. 프라이버시 설계 시 주의사항
5.1 DID와 Link Secret의 관계
credentialSubject에 DID가 포함되어 공개되면, Link Secret의 프라이버시 효과가 무력화된다.
| 상황 | 프라이버시 효과 |
|---|---|
| DID 공개 + Link Secret | 없음 (Holder 식별 가능) |
| DID 숨김 + Link Secret | 비연결성 확보 |
| DID 없음 + Link Secret | 완전한 익명성 |
5.2 올바른 설계 방식
방식 1: DID 없이 발급
Holder Binding은 오직 Link Secret으로만 이루어진다.
방식 2: DID 포함하되 선택적 공개에서 제외
발급 시: credentialSubject.id = "did:example:12345" (포함)
제시 시: id는 숨기고 필요한 속성만 공개, Link Secret으로 소유권 증명
5.3 Predicate Evaluation 활용
나이 확인이 필요한 경우, 실제 나이 대신 Predicate Evaluation을 사용한다.
단, Predicate Evaluation은 BBS+/CL-Signature에서만 가능하다. SD-JWT와 mDoc에서는 age_over_19 같은 사전 계산된 속성을 별도로 발급해야 한다.
6. 기술 비교 요약
6.1 포맷별 비교
| 구분 | W3C VC (BBS+) | SD-JWT | ISO mDoc |
|---|---|---|---|
| 데이터 형식 | JSON-LD | JSON (JWT) | CBOR |
| 서명 방식 | BBS+ (페어링) | ECDSA/EdDSA | ECDSA/EdDSA (COSE) |
| 선택적 공개 | ZKP 기반 | 해시+솔트 | Digest 대조 |
| 영지식 증명 | 지원 | 미지원 | 미지원 |
| Predicate Evaluation | 지원 | 미지원 | 미지원 |
| 비연결성 | 수학적 보장 | 없음 | 제한적 |
| Holder Binding | Link Secret | Key Binding JWT | Device Binding |
6.2 기술 선택 가이드
| 요구사항 | 권장 기술 |
|---|---|
| 높은 프라이버시 (비연결성 필수) | W3C VC (BBS+) |
| Predicate Evaluation 필요 (예: 나이 ≥ 19) | W3C VC (BBS+) |
| JWT 생태계 호환성 중시 | SD-JWT |
| 하드웨어 보안 및 오프라인 검증 | ISO mDoc |
| 구현 단순성 우선 | SD-JWT |
7. 구현 절차 다이어그램
7.1 Link Secret Binding (W3C VC + BBS+)
sequenceDiagram
autonumber
participant H as Holder
participant I as Issuer
participant V as Verifier
Note over H: 1. Link Secret(s) 생성
Note over H: 2. Blinding Factor(r) 생성
Note over H: 3. Commitment C(s,r) 계산
Note over H: 4. "s를 알고 있음" ZKP 생성
H->>I: 5. C(s,r) + ZKP 전송
Note over I: 6. ZKP 검증
Note over I: 7. 자격증명 생성 및 서명<br/>(속성 + Commitment)
I->>H: 8. 서명된 자격증명 발급
Note over H,V: === 검증 단계 ===
Note over H: 9. Derived Proof 생성<br/>(선택적 공개 + s 소유 증명)
H->>V: 10. Derived Proof 제출
Note over V: 11. Proof 검증<br/>(서명 유효성 + Holder Binding)
7.2 Key Binding (SD-JWT)
sequenceDiagram
autonumber
participant H as Holder
participant I as Issuer
participant V as Verifier
Note over H: 1. Key Pair(PK, SK) 생성
H->>I: 2. Public Key(PK) 전송
Note over I: 3. SD-JWT 생성<br/>(속성 해시 + cnf 클레임에 PK)
I->>H: 4. SD-JWT + Disclosures 발급
Note over H,V: === 검증 단계 ===
H->>V: 5. SD-JWT + 선택 Disclosures 제시
V->>H: 6. Challenge(nonce) 발행
Note over H: 7. SK로 Challenge 서명<br/>→ Key Binding JWT 생성
H->>V: 8. Key Binding JWT 제출
Note over V: 9. 검증<br/>- Issuer 서명<br/>- Disclosure 해시 일치<br/>- Key Binding JWT (cnf의 PK로)
7.3 Device Binding (ISO mDoc)
sequenceDiagram
autonumber
participant H as Holder (Device)
participant I as Issuer
participant V as Verifier
Note over H: 1. Secure Element에서<br/>Device Key Pair(PK, SK) 생성
H->>I: 2. Device Public Key(PK) 전송
Note over I: 3. MSO 생성<br/>(속성별 Digest + deviceKey)
Note over I: 4. MSO에 Issuer 서명
I->>H: 5. mDoc 발급 (MSO + 속성값)
Note over H,V: === 검증 단계 ===
H->>V: 6. Device Engagement (NFC/QR)
V->>H: 7. mdoc Request + Challenge
Note over H: 8. 요청된 속성 추출
Note over H: 9. Secure Element에서<br/>SK로 Challenge 서명
H->>V: 10. MSO + 선택 속성 + Device Auth
Note over V: 11. 검증<br/>- Issuer 서명 (MSO)<br/>- Digest 일치<br/>- Device Auth (deviceKey로)
8. 참고
- W3C Verifiable Credentials Data Model 2.0
- W3C VC Data Integrity (BBS+ Cryptosuite)
- BBS+ Signatures (IETF Draft: draft-irtf-cfrg-bbs-signatures)
- SD-JWT (IETF RFC 9449)
- SD-JWT VC (IETF Draft: draft-ietf-oauth-sd-jwt-vc)
- ISO/IEC 18013-5:2021 (mDL)
- Camenisch, J., & Lysyanskaya, A. (2001). An Efficient System for Non-transferable Anonymous Credentials with Optional Anonymity Revocation