검증 가능 자격 증명 위조 방어 v1.0

색인화된 해시 증인을 사용하는 검증 가능 자격 증명용 위조 방지 메커니즘

W3C 첫 공개 작업 초안

이 문서에 대한 자세한 정보
이 버전:
https://www.w3.org/TR/2026/WD-vc-forgery-defense-1.0-20260630/
최신 게시 버전:
https://www.w3.org/TR/vc-forgery-defense-1.0/
최신 편집자 초안:
https://w3c.github.io/vc-forgery-defense/
이력:
https://www.w3.org/standards/history/vc-forgery-defense-1.0/
커밋 이력
편집자:
Wesley Smith (Digital Bazaar)
Elaine Wooton (초청 전문가)
저자:
Wesley Smith (Digital Bazaar)
Dave Longley (Digital Bazaar)
Manu Sporny (Digital Bazaar)
피드백:
GitHub w3c/vc-forgery-defense (풀 리퀘스트, 새 이슈, 열린 이슈)

초록

이 명세는 발급자검증 가능 자격 증명에 대해 간결한 암호학적 증인의 색인화된 목록을 게시하기 위한 메커니즘을 설명한다. 검증자는 이러한 목록을 사용하여 검증 가능 자격 증명이 주장된 발급자에 의해 실제로 발급되었는지 확인할 수 있다 — 이는 발급자의 서명 키를 침해한 공격자가 위조한 자격 증명과 구별하기 위한 것이다. 증인 목록 자체가 검증 가능 자격 증명이므로, 보호되는 자격 증명과 다른 알고리즘으로 서명될 수 있으며, 여기에는 양자 내성 서명 방식도 포함된다. 이는 기존의 서명 키가 양자 능력을 갖춘 공격자에게 침해된 시나리오에서 이 메커니즘을 특히 가치 있게 만든다.

이 작업은 Quantum-Resistant Cryptosuites 1.0 작업을 보완하며, 동일한 위협, 즉 암호학적으로 관련 있는 양자 컴퓨터에 의한 기존 서명 키의 침해를 동기로 한다. 이러한 암호 제품군은 발급자가 양자 내성 서명으로 새로운 증명을 보호할 수 있게 한다. 이 명세는 발급자가 양자에 취약한 기존 알고리즘으로 서명되었거나 앞으로 서명될 자격 증명에 대해, 양자 내성 방식으로 서명된 증인 목록을 게시함으로써 양자 내성에 기반한 진정성을 확립할 수 있게 한다.

이 명세는 세 가지 사용 모드에 대한 데이터 모델과 알고리즘을 정의한다. 보호되는 자격 증명을 수정하지 않고 기존 Verifiable Credential Bitstring Status List에 편승하는 암시적 모드; 보호되는 자격 증명에 credentialStatus 항목을 추가하는 명시적 모드; 그리고 자체 인덱스 할당을 정의하는 사용 사례를 위한 독립형 모드이다.

이 문서의 상태

이 절은 이 문서가 게시된 시점의 상태를 설명한다. 현재 W3C 발행물 목록과 이 기술 보고서의 최신 개정판은 W3C 표준 및 초안 색인에서 확인할 수 있다.

이 문서는 Verifiable Credentials Working GroupRecommendation 트랙을 사용하여 첫 공개 작업 초안으로 게시하였다.

첫 공개 작업 초안으로 게시되었다는 사실이 W3C 및 그 회원의 승인을 의미하지는 않는다.

이 문서는 초안 문서이며 언제든지 다른 문서로 갱신, 대체 또는 폐기될 수 있다. 이 문서를 진행 중인 작업 이외의 것으로 인용하는 것은 부적절하다.

이 문서는 W3C 특허 정책에 따라 운영되는 그룹에 의해 작성되었다. W3C는 이 그룹의 산출물과 관련하여 이루어진 모든 특허 공개의 공개 목록을 유지한다. 해당 페이지에는 특허 공개를 위한 지침도 포함되어 있다. 자신이 알고 있는 특허가 필수 청구항을 포함한다고 믿는 실제 지식이 있는 개인은 W3C 특허 정책 제6절에 따라 그 정보를 공개해야 한다.

이 문서는 2025년 8월 18일 W3C Process Document의 적용을 받는다.

1. 소개

이 절은 비규범적이다.

검증 가능 자격 증명은 흔히 그 내용에 대한 디지털 서명으로 보호된다. 발급자의 개인 서명 키가 손상되면 — 인프라 침해를 통해서든, 암호학적으로 관련 있는 양자 컴퓨터의 개발과 같은 암호 분석의 진전을 통해서든 — 공격자는 표준 서명 검증만으로는 발급 주체가 만든 것과 구별할 수 없는 자격 증명을 위조할 수 있다.

이 명세는 Verifiable Credential Bitstring Status List와 유사한 메커니즘을 제공하여, 발급자가 자신의 개인 키 자료로 발급된 자격 증명 중 실제로 자신이 발급한 하위 집합이 무엇인지 주장할 수 있게 한다. 이는 발급자가 자신의 자격 증명과 함께 게시하는 증인 목록의 형태를 취한다. 발급된 각 자격 증명에 대해, 발급자는 무작위 시드와 목록 내 자격 증명의 위치에서 파생된 짧은 암호학적 증인을 계산한다. 목록을 가져온 검증자는 자신이 검증하는 자격 증명의 증인이 발급자가 게시한 증인과 일치하는지 확인할 수 있다.

증인 목록 자체는 검증 가능 자격 증명이며 목록에 있는 자격 증명과 다른 디지털 서명 알고리즘을 사용하여 서명될 수 있다. 특히 증인 목록은 Quantum-Resistant Cryptosuites 1.0 명세에 있는 것과 같은 양자 내성 디지털 서명으로 서명될 수 있다. 이런 방식으로 발급자는 기존의 비양자 내성 디지털 서명으로 발급된 자격 증명에 대해 양자 내성 진정성을 확립할 수 있다.

이 명세는 Quantum-Resistant Cryptosuites 1.0을 보완한다. 둘 다 같은 위협 — 특히 암호학적으로 관련 있는 양자 컴퓨터에 의한 기존 서명 키의 침해 — 에 대한 대응이다. 양자 내성 암호 제품군은 향후의 위협을 다루며, 양자 이후 환경에서도 위조 불가능하게 유지되는 증명을 생성한다. 증인 목록은 이미 구축된 기반과 전환 기간을 다룬다. 이는 발급자가 이미 발급되었거나 — 계속 발급되어야 하는 — 기존 서명 기반 자격 증명에 대해 재발급 없이, 양자 이후 서명 아래에서 보증할 수 있게 한다. 두 메커니즘은 함께 사용되도록 의도되어 있다.

1.1 설계 목표

이 절은 비규범적이다.

1.2 사용 개요

이 절은 비규범적이다.

검증 가능 자격 증명 발급 시점에, 발급자는 자격 증명 데이터를 사용하여 암호학적 증인을 생성한다. 이러한 증인들의 집합은 무작위 시드와 결합되어 배열에 패킹되고, 증인 목록 자격 증명으로 함께 게시된다. 이 자격 증명은 — 선택적으로 양자 이후 알고리즘으로 — 서명되며, 검증자가 접근할 수 있도록 게시된다.

검증 시점에, 검증자증인 목록 자격 증명을 얻고, 게시된 무작위 시드와 자격 증명 데이터를 사용하여 검증 중인 자격 증명의 증인을 다시 도출한 다음, 이를 자격 증명의 증인 인덱스에 저장된 값과 비교한다. 불일치는 해당 자격 증명이 주장된 주체에 의해 발급되지 않았음을 나타낸다.

2. 적합성

비규범적으로 표시된 절뿐만 아니라, 이 명세의 모든 작성 지침, 다이어그램, 예제 및 참고 사항은 비규범적이다. 이 명세의 그 밖의 모든 내용은 규범적이다.

이 문서에서 핵심어 MAY, MUST, MUST NOT, OPTIONAL, RECOMMENDED, REQUIRED, 및 SHOULD는 여기에 표시된 것처럼 모두 대문자로 나타날 때, 그리고 그 경우에만 BCP 14 [RFC2119] [RFC8174]에 설명된 대로 해석되어야 한다.

적합 문서4. 데이터 모델 절의 규범 요구 사항을 준수하는 데이터 모델의 모든 구체적 표현이다. 적합 처리기4. 데이터 모델5. 알고리즘 절의 규범 요구 사항에 따라 적합 문서를 생성하거나 소비하는, 소프트웨어 및/또는 하드웨어로 실현된 모든 알고리즘이다.

적합 처리기는 부적합 문서가 소비될 때 오류를 생성해야 한다(MUST).

3. 용어

다음 용어는 이 문서 전반에서 사용된다. [VC-DATA-MODEL-2.0]에 정의된 용어는 그곳에 정의된 의미로 사용된다.

증인
SHA-256(seedBytes || credentialHash)를 계산하고 그 출력의 최상위 증인 길이 비트를 취하여, 증인 시드와 자격 증명 해시에서 파생되는 고정 길이 의사난수 비트열.
증인 목록
연속 비트 배열에 패킹되고 multibase 문자열로 인코딩된 증인들의 순서 있는 시퀀스.
증인 목록 자격 증명
credentialSubjectWitnessList 유형이고 증인 목록 속성을 포함하는, WitnessListCredential 유형의 검증 가능 자격 증명.
증인 목록 항목
명시적 모드에서 보호되는 검증 가능 자격 증명credentialStatus에 나타날 수 있는(MAY) WitnessListEntry 유형의 객체로, 명시적인 witnessListCredential 속성을 통해 참조되는 증인 목록 자격 증명 내 위치에 해당 자격 증명을 연결한다.
증인 시드
목록의 모든 증인을 생성하기 위한 비밀 솔트로 사용되는 UUID v4 [RFC4122] 값. 시드는 암호학적으로 안전한 난수 생성기를 사용하여 생성되어야 한다(MUST).
증인 인덱스
증인 목록에서 자격 증명의 위치를 식별하는 양의 정수(1부터 시작).
증인 길이
증인의 비트 수. 기본값은 128이다. 더 큰 값은 거짓 양성 일치 확률을 낮춘다. 7.3 거짓 양성률을 참조하라.
증인 수
증인 목록에 있는 증인의 총수.
인코딩된 증인
증인 목록에 있는 모든 증인의 패킹된 비트 배열을 The Multibase Encoding Scheme로 인코딩한 값(base64url, 접두사 u)이며, JSON-LD 컨텍스트에서 https://w3id.org/security#multibase로 형식화된다.
암시적 모드
보호되는 자격 증명이 증인 목록에 대한 참조를 포함하지 않는 사용 모드. 목록 위치와 증인 인덱스는 자격 증명의 기존 credentialStatus 항목에서 추론되며, 상태 목록 인덱스가 증인 인덱스로 재사용된다.
명시적 모드
보호되는 자격 증명이 그 credentialStatus 안에 증인 목록 항목을 포함하고, 해당 항목이 증인 목록 자격 증명증인 인덱스를 직접 참조하는 사용 모드.
독립형 모드
증인 인덱스 할당이 어떠한 상태 목록 인프라와도 독립적으로 애플리케이션 또는 사용 사례에 의해 정의되는 사용 모드.

4. 데이터 모델

4.1 증인 목록 자격 증명

증인 목록 자격 증명credentialSubjectWitnessList 유형이고 증인 목록 속성 (witnessSeed, witnessLength, witnessCount, 및 encodedWitnesses)을 직접 담는 검증 가능 자격 증명이다. 발급자는 증인 목록 자격 증명에 서명하기 위해 별도의 키 쌍을 사용해야 하며(SHOULD) — 양자 이후 서명 방식을 사용할 수 있다(MAY). 이는 그 제공하는 보호가 일반 서명 키가 손상된 뒤에도 검증될 수 있을 때에만 의미가 있기 때문이다.

자격 증명의 type 배열은 WitnessListCredential을 포함해야 한다(MUST).

예제 1: 증인 목록 자격 증명
{
  "@context": [
    "https://www.w3.org/ns/credentials/v2",
    "https://w3id.org/vc-forgery-defense/v1rc1"
  ],
  "id": "https://issuer.example/witnesses/1",
  "type": ["VerifiableCredential", "WitnessListCredential"],
  "issuer": "did:example:issuer",
  "validFrom": "2024-01-15T00:00:00Z",
  "credentialSubject": {
    "type": "WitnessList",
    "witnessSeed": "26ea4078-968d-4d98-aba7-695610c0dfb6",
    "witnessLength": 128,
    "witnessCount": 131072,
    "encodedWitnesses": "uQYF16SSSbR_LrMZFbFvbGkn8B7ggEZtov3KVL..."
  },
  "proof": {
    "type": "DataIntegrityProof",
    "cryptosuite": "eddsa-rdfc-2022",
    "comment": "MAY use a post-quantum cryptosuite here",
    "verificationMethod": "did:example:issuer#pq-key-1",
    "proofPurpose": "assertionMethod",
    "proofValue": "z..."
  }
}

WitnessListCredentials가 발급자에 의해 공간 제약이 있는 매체(예: 대형 자격 증명을 위한 웹)를 통해 배포될 때는, 이를 CBOR-LD로 인코딩하여 바이트로 전송하는 것이 권장된다(RECOMMENDED).

4.1.1 증인 목록 속성

WitnessListcredentialSubject는 다음 속성을 직접 포함해야 한다(MUST).

witnessSeed
REQUIRED. 증인 시드로 사용되는 UUID v4 문자열 [RFC4122]. 구현은 WitnessListCredential을 발급할 때마다 새로운 witnessSeed 값을 생성해야 한다(MUST).
witnessLength
REQUIRED. 각 증인당 비트 수를 지정하는 양의 정수. 적어도 32이어야 한다(MUST). 적어도 128인 것이 바람직하다(SHOULD). 기본값은 128이다.
witnessCount
REQUIRED. 목록 내 증인의 총수를 지정하는 양의 정수로, 인코딩된 증인 값의 예상 길이를 결정한다. 그룹 개인정보 보호가 충분히 큰 witnessCount에 의존한다는 점에 유의하여, 구현은 131072 이상인 값을 선택해야 한다(MUST).
encodedWitnesses
REQUIRED. 모든 증인의 패킹된 비트 배열을 나타내는, The Multibase Encoding Scheme로 인코딩된 문자열 (base64url, 접두사 u)이며, https://w3id.org/security#multibase로 형식화된다. 증인 인덱스 i의 증인은 (i − 1) × witnessLength부터 i × witnessLength − 1까지의 비트(포함)를 최상위 비트 우선 순서로 차지한다.

4.2 증인 목록 항목

명시적 모드에서 사용될 때, 보호되는 검증 가능 자격 증명은 그 credentialStatus 배열에(또는 유일한 credentialStatus 값으로) 증인 목록 항목을 포함할 수 있다(MAY).

항목의 typeWitnessListEntry이어야 한다(MUST). Verifiable Credential Bitstring Status ListstatusListCredential 속성 패턴을 따라, 이 항목은 명시적인 witnessListCredential 속성을 통해 그 증인 목록 자격 증명을 참조하며, 그 값은 해당 자격 증명의 URL이다. 항목의 id가 있는 경우, 이는 항목에 대한 선택적(OPTIONAL) 고유 식별자이며, 목록을 찾는 데 사용되지 않는다.

witnessListCredential
REQUIRED. 이 자격 증명에 대한 증인 목록 자격 증명으로 역참조되는 URL. 이 속성은 Verifiable Credential Bitstring Status ListstatusListCredential와 유사한 속성이다.
witnessIndex
REQUIRED. 참조된 목록에서 이 자격 증명의 증인 위치를 지정하는 양의 정수(1부터 시작). 0보다 커야 하며(MUST) witnessCount를 초과해서는 안 된다(MUST NOT).
예제 2: Bitstring Status와 함께 명시적 Witness List Entry를 포함하는 자격 증명
{
  "@context": [
    "https://www.w3.org/ns/credentials/v2",
    "https://w3id.org/vc-forgery-defense/v1rc1"
  ],
  "id": "https://issuer.example/credentials/1234",
  "type": ["VerifiableCredential", "ExampleDegreeCredential"],
  "issuer": "did:example:issuer",
  "validFrom": "2024-01-15T00:00:00Z",
  "credentialStatus": [
    {
      "id": "https://issuer.example/status/1#94567",
      "type": "BitstringStatusListEntry",
      "statusPurpose": "revocation",
      "statusListIndex": "94567",
      "statusListCredential": "https://issuer.example/status/1"
    },
    {
      "type": "WitnessListEntry",
      "witnessListCredential": "https://issuer.example/witnesses/1",
      "witnessIndex": 94567
    }
  ],
  "credentialSubject": {
    "id": "did:example:holder",
    "degree": {"type": "BachelorDegree", "name": "Computer Science"}
  },
  "proof": { ... }
}

5. 알고리즘

5.1 증인 목록 생성

다음 알고리즘은 N개의 자격 증명 해시 집합에 대한 증인 목록을 생성한다. 입력: 원하는 witnessIndex 값의 순서대로 정렬된 N개의 해시 배열과 증인 길이 b (기본값 128). 출력: 증인 시드인코딩된 증인.

  1. 암호학적으로 안전한 난수 생성기를 사용하여 UUID v4 값 seed를 생성한다 [RFC4122].
  2. seedBytesseed의 16바이트 표현으로 둔다. 이는 하이픈을 제거한 뒤 16진수 숫자를 빅엔디언 바이트 시퀀스로 디코딩하여 얻는다.
  3. dataN × b비트의 0으로 채워진 비트 배열로 둔다.
  4. 각 정수 i에 대해 0부터 N-1까지(포함) 다음을 수행한다.
    1. msg를 입력 배열의 i번째 자격 증명 해시로 둔다.
    2. hashseedBytes || msg의 연결에 SHA-256 [FIPS-180-4]을 적용한 출력으로 둔다.
    3. whash의 최상위 b비트로 둔다.
    4. wdata의 비트 오프셋 (i − 1) × b에 최상위 비트 우선으로 쓴다.
  5. encodedWitnessesdata의 multibase-base64url 인코딩으로 두고, 접두사 문자 u를 앞에 붙인다 [MULTIBASE].
  6. seedencodedWitnesses를 반환한다.

5.2 증인 목록 자격 증명 생성

다음 알고리즘은 증인 목록 생성의 출력을 서명된 검증 가능 자격 증명으로 감싼다.

  1. 입력 Nb증인 목록 생성을 실행하여, seedencodedWitnesses를 생성한다.
  2. 다음을 포함하는 서명되지 않은 자격 증명을 구성한다.
    • typeWitnessListCredential 포함
    • credentialSubject.typeWitnessList로 설정
    • credentialSubject.witnessSeedseed로 설정
    • credentialSubject.witnessLengthb로 설정
    • credentialSubject.witnessCountN으로 설정
    • credentialSubject.encodedWitnessesencodedWitnesses로 설정
  3. 자격 증명에 서명한다. 키 침해 — 양자 키 침해 포함 — 에 대한 보호가 필요한 경우, 발급자는 보호되는 자격 증명에 서명하는 데 사용한 것과 구별되는 키 쌍 및 양자 이후 서명 방식을 사용해야 한다(SHOULD).
  4. 서명된 자격 증명을 반환한다.

5.3 자격 증명 증인 검증

다음 알고리즘은 주어진 자격 증명의 증인이 유효한지 검증한다. 입력: 해석된 증인 목록 자격 증명, 자격 증명 해시, 그리고 증인 인덱스 i.

  1. 증인 목록 자격 증명의 모든 증명을 검증한다. 어떤 증명이라도 실패하면 오류를 반환한다.
  2. subject를 증인 목록 자격 증명의 credentialSubject로 둔다.
  3. seedsubject.witnessSeed로 둔다.
  4. bsubject.witnessLength로 둔다.
  5. Nsubject.witnessCount로 둔다.
  6. i < 1 또는 i > N이면, 인덱스가 범위를 벗어났음을 나타내는 오류를 반환한다.
  7. encodedWitnessessubject.encodedWitnesses로 둔다.
  8. encodedWitnesses가 문자 u로 시작하는지 검증한다. 그렇지 않으면 오류를 반환한다.
  9. encodedWitnesses의 첫 문자 뒤 부분 문자열을 base64url로 디코딩한 결과를 data로 둔다.
  10. data에서 오프셋 (i − 1) × b부터 i × b − 1까지의 비트를 최상위 비트 우선으로 추출한다. 이를 storedW로 둔다.
  11. seedBytesseed의 16바이트 표현으로 둔다. 이는 하이픈을 제거한 뒤 16진수 숫자를 빅엔디언 바이트 시퀀스로 디코딩하여 얻는다.
  12. msg를 입력 자격 증명 해시로 둔다.
  13. hashseedBytes || msg의 SHA-256 [FIPS-180-4]으로 둔다.
  14. computedWhash의 최상위 b비트로 둔다.
  15. storedWcomputedW와 같으면 valid를 반환한다. 그렇지 않으면 invalid를 반환한다.

6. 사용 모드

6.1 암시적 모드

암시적 모드에서는 보호되는 자격 증명이 수정되지 않는다. 증인 목록에 대한 어떤 참조도 자격 증명 자체에 나타나지 않는다. 검증자는 대역 외 정보 — 일반적으로 자격 증명의 기존 credentialStatus 항목에서 파생된 정보 — 를 사용하여 증인 목록을 찾고, 상태 목록 인덱스를 증인 인덱스로 재사용한다.

이 모드는 다음을 요구한다(REQUIRES).

예제 3: 암시적 모드에서 증인 목록 해석
// 보호되는 자격 증명은 다음을 가진다:
//   credentialStatus.statusListCredential = "https://issuer.example/status/1"
//   credentialStatus.statusListIndex      = "94567"

// 검증자는 발급자 메타데이터에서 증인 목록 URL을 발견한다:
// GET https://issuer.example/.well-known/witness-lists
// -> { "https://issuer.example/status/1":
//      "https://issuer.example/witnesses/1" }

// 증인 인덱스 = 94567 (상태 목록 인덱스와 동일)
// 실행: i = 94567로 Verify a Credential Witness

6.2 명시적 모드

명시적 모드에서는 보호되는 자격 증명이 그 credentialStatus 안에 증인 목록 항목을 포함한다. 항목의 witnessListCredential 속성은 증인 목록 자격 증명 URL을 제공하고, witnessIndex는 목록 내 1부터 시작하는 위치를 지정한다. 검색 메커니즘은 필요하지 않다.

명시적 모드는 다른 credentialStatus 항목 (예: 폐지를 위한 BitstringStatusListEntry)과 공존할 수 있다(MAY). 둘 다 있는 경우, witnessIndex가 상태 목록 인덱스와 같을 필요는 없다.

6.2.1 명시적 모드에서의 검증

  1. WitnessListEntry 유형의 credentialStatus 항목을 찾는다.
  2. 증인 목록 자격 증명 URL을 해당 항목의 witnessListCredential 속성 값으로 둔다.
  3. 그 URL을 역참조하여 증인 목록 자격 증명을 얻는다.
  4. witnessIndex 값을 i로 사용하여 자격 증명 증인 검증을 실행한다.

6.3 독립형 모드

독립형 모드에서는 증인 목록이 어떤 상태 목록 인프라와도 독립적으로 사용된다. 자격 증명에 대한 증인 인덱스의 할당은 특정 애플리케이션 또는 사용 사례에 의해 정의된다. 증인 목록 자격 증명은 자격 증명, 애플리케이션 계층 레코드 또는 외부 레지스트리에서 참조될 수 있다(MAY) — 참조 메커니즘은 이 명세의 범위를 벗어난다.

7. 보안 고려 사항

7.1 양자 키 침해

양자 능력을 갖춘 공격자는 기존(예: ECDSA) 공개 키에 대응하는 개인 키를 복구할 수 있다. 발급자가 증인 목록 자격 증명에 양자 이후 서명 방식으로 서명했다면, 그 목록에 있는 자격 증명의 서명 키가 깨진 뒤에도, 양자 이후 키가 안전하게 유지되는 한 검증자는 여전히 증인 목록을 신뢰할 수 있다.

발급자는 그 증인 목록 자격 증명이 포괄하는 자격 증명이 상당한 가치 또는 긴 유효 기간을 가질 때마다 증인 목록 자격 증명에 양자 이후 서명 방식으로 서명해야 한다(SHOULD).

7.2 시드 기밀성

증인 시드는 증인 목록 자격 증명의 credentialSubject에 나타나며, 증인 목록 자격 증명을 얻은 모든 당사자에게 보인다. 이는 의도된 설계이다 — 검증자는 증인을 다시 계산하기 위해 시드가 필요하다. 검증을 특정 검증자 집합으로 제한하려는 발급자는 증인 목록 자격 증명의 배포를 그에 맞게 제한해야 한다(SHOULD).

7.3 거짓 양성률

인덱스 i의 위조된 자격 증명은 2b의 확률로 증인 검증을 통과한다. 여기서 b증인 길이이다. 기본값 b = 128에서 이 확률은 약 2.9 × 10−39이다.

구현은 b가 32보다 작은 값을 허용해서는 안 된다(MUST NOT). 상당한 가치가 있는 자격 증명에는 최소 64가 권장된다(RECOMMENDED).

증인은 일반적으로 충돌에 강한 방식으로 계산되어야 하며(SHOULD), 두 번째 원상 공격에 강한 방식으로 계산되어야 한다(MUST).

7.4 증인 목록 무결성

검증자는 그 내용을 신뢰하기 전에 증인 목록 자격 증명의 증명을 검증해야 한다(MUST). 검증자는 네트워크 노출 및 서비스 거부 위험을 줄이기 위해 해석된 증인 목록 자격 증명을 그 유효 기간 동안 캐시해야 한다(SHOULD).

7.5 발급자 정보 유출

목록이 포괄하는 발급된 검증 가능 자격 증명의 수에 정확히 맞춘 witnessCount를 사용하면, 발급자 프로세스에 관한 정보가 두 가지 방식으로 유출된다.

첫 번째 유출을 완화하기 위해, 발급자는 고정된 witnessCount 값을 사용해야 한다(SHOULD). 이를 통해 모든 증인 목록에서 총 증인 수가 변하지 않도록 하고, 임의 데이터 증인 자리표시자는 시간이 지남에 따라 VC에 대응하는 증인으로 대체된다.

이것은 첫 번째 유출을 완화하는 데 충분하다 - 그러나 공격자는 시간이 지남에 따라 어떤 증인 값이 바뀌는지 추적함으로써 여전히 얼마나 많은 증인이 "실제"인지, 그리고 얼마나 많은 VC가 발급되고 있는지 추적할 수 있다. 이를 해결하기 위해, 발급자는 WitnessListCredential을 갱신할 때마다 무작위 증인 시드를 다시 생성해야 한다(MUST).

7.6 목록 교체 및 롤백

게시된 증인 목록 자격 증명을 수정된 버전으로 교체할 수 있는 공격자는 위조 방지 메커니즘을 우회할 수 있다. 발급자는 무결성이 보호되는 채널을 통해 증인 목록 자격 증명을 게시해야 하며(MUST), 짧은 유효 기간과 빈번한 재발급을 함께 사용해야 한다(SHOULD).

7.7 증인 교체를 통한 발급자 부인

발급자는 증인 목록 자격 증명의 유일한 작성자이며, 목록이 갱신될 때마다 증인 시드를 다시 생성해야 한다(REQUIRED) (7.5 발급자 정보 유출 참조). 따라서 발급자는 이전에 발급한 자격 증명을 부인할 수 있다. 즉, 해당 자격 증명의 증인이 없거나 변경된 새로운 증인 목록 자격 증명을 게시하면, 최신 목록에 대해 증인을 다시 계산하는 검증자는 불일치를 얻고, 그 밖에는 진짜인 자격 증명을 거부하게 된다. 위조와 달리, 이 동작은 정당한 발급자가 할 수 있으며 메커니즘만으로는 방지될 수 없다. 게시된 모든 목록이 유효하게 서명된 자격 증명이기 때문이다.

이후의 부인에도 발급의 증거가 유지되기를 요구하는 의존 당사자는, 자신들이 의존한 증인 목록 자격 증명을 그 증명 및 유효 기간과 함께 보관(캐시 또는 아카이브)해야 한다(SHOULD). 각 증인 목록 자격 증명validFrom 값을 가진 서명된 검증 가능 자격 증명 자체이므로, 부인 이전에 게시된 목록에 대해 검증된 자격 증명은 여전히 그 이전 목록 시점에 진짜였음을 보여줄 수 있다. 캐시된 서명 목록은 발급자가 그 시점에 해당 자격 증명을 증명했음을 보여주는 지속적인 증거이다. 게시된 목록에 대한 독립적인 아카이브, 공증 또는 투명성 로그 증인은 발급자의 게시 이력을 부인 불가능하게 만들어 이 보증을 강화한다.

8. 개인정보 보호 고려 사항

8.1 그룹 개인정보 보호와 목록 크기

witnessCount 값은 배치 내 자격 증명의 최대 수를 드러낸다. 발급자는 개별 보유자가 목록 내 위치로 식별되지 않도록 큰 집합 크기(최소 131072개 항목)를 사용해야 한다(MUST). 이러한 집합의 모든 슬롯은, 증인을 생성하는 데 사용된 해시가 검증 가능 자격 증명에 대응하는지 여부와 관계없이 채워져야 한다.

8.2 상관 위험

증인 목록 자격 증명을 가져오는 것은 검증이 발생하고 있음을 호스트에게 드러낼 수 있는 네트워크 요청을 생성한다. 검증자는 증인 목록 자격 증명을 캐시해야 하며(SHOULD), 목록을 가져올 때 개인정보 보호 보존 네트워크 전송을 사용할 수 있다(MAY). 발급자는 상관 가능성을 줄이기 위해 CDN 또는 콘텐츠 주소 지정 시스템을 통해 증인 목록을 제공해야 한다(SHOULD).

9. JSON-LD 컨텍스트

이 문서의 예제는 vc-forgery-defense JSON-LD 컨텍스트의 v1rc1 버전을 참조한다. 이 컨텍스트는 참고를 위해 아래에 재현되어 있다.

예제 4: 위조 방어 JSON-LD 컨텍스트(v1rc1)
{
  "@context": {
    "@protected": true,
    "id":   "@id",
    "type": "@type",

    "WitnessListCredential": "https://w3id.org/vc-forgery-defense#WitnessListCredential",
    "WitnessList":           "https://w3id.org/vc-forgery-defense#WitnessList",
    "WitnessListEntry":      "https://w3id.org/vc-forgery-defense#WitnessListEntry",

    "witnessSeed": {
      "@id": "https://w3id.org/vc-forgery-defense#witnessSeed"
    },
    "encodedWitnesses": {
      "@id":   "https://w3id.org/vc-forgery-defense#encodedWitnesses",
      "@type": "https://w3id.org/security#multibase"
    },
    "witnessLength": {
      "@id":   "https://w3id.org/vc-forgery-defense#witnessLength",
      "@type": "http://www.w3.org/2001/XMLSchema#integer"
    },
    "witnessCount": {
      "@id":   "https://w3id.org/vc-forgery-defense#witnessCount",
      "@type": "http://www.w3.org/2001/XMLSchema#integer"
    },
    "witnessIndex": {
      "@id":   "https://w3id.org/vc-forgery-defense#witnessIndex",
      "@type": "http://www.w3.org/2001/XMLSchema#integer"
    },
    "witnessListCredential": {
      "@id":   "https://w3id.org/vc-forgery-defense#witnessListCredential",
      "@type": "@id"
    }
  }
}

A. 참고 문헌

A.1 규범 참고 문헌

[FIPS-180-4]
Secure Hash Standard (SHS). NIST. URL: https://csrc.nist.gov/publications/detail/fips/180/4/final
[MULTIBASE]
The Multibase Encoding Scheme. Juan Benet; Manu Sporny. URL: https://datatracker.ietf.org/doc/html/draft-multiformats-multibase
[RFC2119]
Key words for use in RFCs to Indicate Requirement Levels. S. Bradner. IETF. 1997년 3월. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC4122]
A Universally Unique IDentifier (UUID) URN Namespace. P. Leach; M. Mealling; R. Salz. IETF. URL: https://www.rfc-editor.org/rfc/rfc4122
[RFC8174]
Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words. B. Leiba. IETF. 2017년 5월. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc8174
[VC-BITSTRING-STATUS-LIST]
Verifiable Credential Bitstring Status List. Manu Sporny; Dave Longley; Markus Sabadello. W3C. W3C Recommendation. URL: https://www.w3.org/TR/vc-bitstring-status-list/
[VC-DATA-MODEL-2.0]
Verifiable Credentials Data Model 2.0. Manu Sporny; Ted Thibodeau Jr; Ivan Herman; Michael B. Jones; Gabe Cohen. W3C. W3C Recommendation. URL: https://www.w3.org/TR/vc-data-model-2.0/

A.2 정보 참고 문헌

[VC-DI-QUANTUM-RESISTANT]
Quantum-Resistant Cryptosuites 1.0. Manu Sporny; Dave Longley; Markus Sabadello. W3C. W3C Recommendation. URL: https://www.w3.org/TR/vc-di-quantum-resistant-1.0/