Copyright © 2026 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
本规范描述了一种机制,供签发者发布 可验证 凭证的紧凑加密见证索引列表。 验证者可以使用这些列表来 确认某个可验证凭证确实由所声称的 签发者签发——而不是由已攻破签发者 签名密钥的攻击者伪造的凭证。由于见证列表本身 就是一个可验证凭证,因此它可以使用与 受保护凭证不同的算法进行签名,包括后量子签名方案。这 使得该机制在传统 签名密钥已被具备量子能力的对手攻破的场景中特别有价值。
这项工作是对抗量子密码套件 1.0工作的补充, 并由同一威胁所驱动:具备密码学相关能力的量子计算机 攻破传统签名密钥。 这些密码套件让签发者能够使用后量子 签名保护新的证明;本规范则让签发者能够 通过发布一个本身使用后量子方案签名的见证列表, 为已经使用或将会使用传统量子易受攻击算法签名的凭证 建立由后量子方案支持的真实性。
本规范为三种使用
模式定义了数据模型和算法:一种隐式模式,它搭载于现有
可验证凭证位串状态
列表之上,而无需
修改受保护凭证;一种显式模式,它向受保护凭证添加一个
credentialStatus 条目;以及一种
独立模式,用于定义其自身索引
分配方式的用例。
本节描述本文档在 发布时的状态。当前 W3C 出版物列表和本技术报告的最新修订版可在 W3C 标准和草案 索引中找到。
本文档由可验证凭证工作 组作为 首次公开工作草案发布,并使用 推荐 标准轨道。
作为 首次公开工作草案发布并不意味着 W3C 及其成员认可该文档。
这是一份草案文档,可能会在任何时候由其他 文档更新、替换或废弃。除作为进行中的工作外, 不宜引用本文档。
本文档由一个在 W3C 专利 政策下运作的小组制作。 W3C 维护着一个 公开的专利披露列表, 其中列出与该小组交付物相关的 任何专利披露;该页面还包括 披露专利的说明。任何实际 知晓某项专利,并认为该专利包含 必要权利要求的个人, 必须依照 W3C 专利政策第 6 节 披露该信息。
本文档受 2025 年 8 月 18 日 W3C 流程文档约束。
本节为非规范性内容。
可验证 凭证通常使用覆盖其 内容的数字签名来保护。如果签发者的私有签名密钥遭到攻破——无论是 通过基础设施入侵,还是通过密码分析方面的进展,例如 密码学相关量子计算机的发展—— 攻击者就能够伪造凭证,而仅使用标准签名验证时, 这些凭证与签发方创建的凭证无法区分。
本规范提供了一种类似于 可验证凭证位串状态 列表 的机制,使签发者能够断言使用其私钥材料签发的凭证中, 哪个子集确实由其签发。其形式是签发者与其 凭证一同发布的见证列表。对于每个签发的凭证, 签发者都会计算一个短的 加密见证,该见证由随机种子和该凭证在列表中的 位置派生而来。获取该列表的验证者可以确认 其正在验证的凭证的见证,与签发者发布的见证 是否匹配。
该见证列表本身是一个可验证凭证,并且 可以使用与列表中凭证 不同的数字签名算法进行签名。重要的是,该见证列表可以使用 抗量子数字签名进行签名,例如 抗量子密码套件 1.0规范中的签名。通过这种方式,签发者可以为使用 传统且非抗量子数字签名签发的凭证 建立抗量子真实性。
本规范是对 抗量子密码套件 1.0的补充。二者都是对同一威胁的响应—— 传统签名密钥遭到攻破,尤其是被密码学 相关量子计算机攻破。抗量子密码套件面向未来应对此威胁, 生成在后量子 环境中仍不可伪造的证明。见证列表则面向已部署基础和 过渡时期:它使签发者能够在后量子签名下, 为已经签发的凭证——或必须继续在 传统签名下签发的凭证——作保,而无需重新签发它们。这两种 机制旨在结合使用。
本节为非规范性内容。
本节为非规范性内容。
在可验证凭证 签发时,签发者使用凭证数据 创建加密见证。一组这样的见证会与一个随机 种子组合,打包成数组,并作为见证列表 凭证一起发布。 该凭证会被签名——可选地使用后量子算法——并 发布以供验证者访问。
在验证时,验证者获取 见证列表凭证,使用已发布的随机 种子和凭证数据,重新派生其正在验证的 凭证的见证,并将其与存储在该 凭证见证索引处的值进行比较。不匹配表示该凭证并非由 所声称的一方签发。
除标记为非规范性的章节外,本规范中的所有创作指南、图表、示例和注释均为非规范性内容。本规范中的其他所有内容均为规范性内容。
本文档中的关键词 MAY、MUST、MUST NOT、OPTIONAL、RECOMMENDED、REQUIRED 和 SHOULD 应按照 BCP 14 [RFC2119] [RFC8174] 中的描述进行解释,但仅当它们如这里所示以全 大写形式出现时才如此。
一致性文档是数据 模型的任何具体表达,其符合第 4. 数据模型中的规范性要求。一致性 处理器是以软件和/或硬件实现的任何 算法,其按照第 4. 数据模型和第 5. 算法中的规范性要求生成或使用 一致性文档。
一致性处理器在使用非一致性文档时 MUST 产生错误。
下列术语在本文档中通篇使用。定义于 [VC-DATA-MODEL-2.0] 中的术语按其中 定义的含义使用。
SHA-256(seedBytes || credentialHash),并取输出中最高有效的
见证长度位,从
见证种子和凭证哈希派生而来。
WitnessListCredential 的可验证凭证,
其 credentialSubject 的类型为 WitnessList,
并包含见证列表属性。
WitnessListEntry 的对象,在
显式模式下 MAY 出现在受保护可验证凭证的
credentialStatus 中,将该凭证链接到其在
见证列表凭证中的位置,该凭证通过显式
witnessListCredential 属性进行引用。
u)所有见证的打包位数组,位于
见证列表中,并在 JSON-LD 上下文中类型化为
https://w3id.org/security#multibase。
credentialStatus 条目推断,
并且状态列表索引会被复用为见证索引。
credentialStatus
中包含一个
见证列表条目,该条目
直接引用见证列表凭证和
见证索引。
见证列表凭证是一个
可验证
凭证,其 credentialSubject 的类型为
WitnessList,并直接携带见证列表属性
(witnessSeed、witnessLength、
witnessCount 和 encodedWitnesses)。签发者 SHOULD 使用
单独的密钥对——并且 MAY 使用后量子签名方案——来
签署见证列表凭证,因为只有在普通签名密钥
遭到攻破后仍可验证时,其提供的保护
才有意义。
该凭证的 type 数组 MUST 包含
WitnessListCredential。
{
"@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..."
}
}
当签发者通过空间受限的媒介(例如在 Web 上分发大型凭证)
分发 WitnessListCredentials 时,
RECOMMENDED 将其进行 CBOR-LD
编码并作为字节传输。
WitnessList 的 credentialSubject
MUST 直接包含以下属性。
u),类型化为
https://w3id.org/security#multibase,表示所有
见证的打包位数组。
见证索引 i 的见证占据
(i − 1) × witnessLength 到
i × witnessLength − 1(含)的位,
按最高有效位优先顺序排列。
在显式模式下使用时,受保护的可验证
凭证 MAY 在其
credentialStatus 数组中包含一个见证列表
条目(或将其作为唯一的
credentialStatus 值)。
该条目的 type MUST 为 WitnessListEntry。
按照 可验证凭证位串状态
列表的
statusListCredential 属性模式,该条目通过显式的
witnessListCredential 属性引用其
见证列表凭证,该属性的值是
该凭证的 URL。条目的 id(如果存在)是该条目的 OPTIONAL
唯一标识符,不用于定位列表。
statusListCredential。
witnessCount。
{
"@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": { ... }
}
以下算法为一组 N 个凭证哈希生成见证列表。输入:一个包含 N 个哈希的数组, 按照所需的 witnessIndex 值的顺序排列, 以及见证长度 b(默认 128)。输出: 见证种子和编码见证。
(i − 1) × b。
u
[MULTIBASE]。
以下算法将 生成见证列表的输出包装到 一个已签名的可验证凭证中。
type 包含 WitnessListCredentialcredentialSubject.type 设置为 WitnessListcredentialSubject.witnessSeed
设置为 seedcredentialSubject.witnessLength
设置为 bcredentialSubject.witnessCount
设置为 NcredentialSubject.encodedWitnesses
设置为 encodedWitnesses以下算法验证给定凭证的见证 是否有效。输入:已解析的见证列表凭证、一个 凭证 哈希,以及见证索引 i。
credentialSubject。
.witnessSeed。.witnessLength。.witnessCount。.encodedWitnesses。
u 开头。如果不是,则返回错误。
(i − 1) × b 到
i × b − 1 的位,按最高有效位优先。
令其为 storedW。
valid。否则返回 invalid。
在隐式模式下,受保护凭证不作修改。
凭证本身不出现对见证列表的引用。
验证者使用带外信息定位见证列表——
通常从凭证现有的
credentialStatus 条目派生——并复用状态列表索引
作为见证索引。
此模式要求:
BitstringStatusListEntry
(或等效项),其索引与
见证列表中的位置一一对应。
// Protected credential has:
// credentialStatus.statusListCredential = "https://issuer.example/status/1"
// credentialStatus.statusListIndex = "94567"
// Verifier discovers witness list URL from issuer metadata:
// GET https://issuer.example/.well-known/witness-lists
// -> { "https://issuer.example/status/1":
// "https://issuer.example/witnesses/1" }
// Witness index = 94567 (same as status list index)
// Run: Verify a Credential Witness with i = 94567
在显式模式下,受保护凭证在其 credentialStatus 中包含一个
见证列表条目。
该
条目的 witnessListCredential 属性给出
见证列表凭证 URL,并且
witnessIndex
指定列表中从 1 开始的位置。不需要发现机制。
显式模式 MAY 与其他 credentialStatus
条目共存(例如用于撤销的 BitstringStatusListEntry)。
如果二者同时存在,witnessIndex 不必等于
状态列表索引。
在独立模式下,见证列表 独立于任何状态列表基础设施使用。将 见证索引分配给凭证的方式由具体 应用或用例定义。见证列表凭证 MAY 从凭证、应用层记录或外部 注册表中引用——引用机制不在本 规范范围内。
具备量子能力的对手可以恢复与 传统(例如 ECDSA)公钥对应的私钥。如果签发者已经 使用后量子签名方案签署了见证列表凭证, 那么只要后量子密钥保持安全,验证者即使在 该列表中凭证的签名密钥被破解之后,仍然可以信任该见证列表。
当见证列表凭证所涵盖的凭证具有重要 价值或长期有效性时,签发者 SHOULD 使用后量子 签名方案对见证列表凭证进行签名。
见证种子出现在见证列表凭证的
credentialSubject 中,并且
对任何获得该见证列表凭证的一方可见。
这是有意设计的——验证者需要该种子来重新计算见证。
希望将验证限制在特定验证者集合内的签发者
SHOULD 相应地限制见证列表凭证的分发。
索引 i 处的伪造凭证通过见证验证的概率为 2−b,其中 b 是 见证长度。在默认值 b = 128 时, 该概率约为 2.9 × 10−39。
实现 MUST NOT 接受小于 32 的 b 值。对于具有重要价值的凭证, RECOMMENDED 的最小值为 64。
见证 SHOULD 以通常抗碰撞的方式计算, 但它们 MUST 以抗第二原像的方式计算。
验证者 MUST 在信任见证列表 凭证 的内容之前,验证其证明。验证者 SHOULD 在其有效期内缓存已解析的见证 列表凭证,以减少网络暴露和 拒绝服务风险。
将 witnessCount 精确设置为列表所涵盖的已签发 可验证凭证 数量,会以两种方式泄露有关签发者 流程的信息:
为缓解第一种泄露,签发者 SHOULD 使用固定的 witnessCount 值,使得所有见证列表中的见证总数 不发生变化,并随着时间推移,将任意数据见证占位符 替换为对应于 VC 的见证。
这足以缓解第一种泄露——然而,攻击者仍可能通过跟踪 哪些见证值随时间发生变化,来追踪有多少见证是“真实”的,以及签发了多少 VC。 为解决此问题,签发者 MUST 在每次更新 WitnessListCredential 时重新生成随机见证种子。
能够用修改版本替换已发布见证列表凭证的攻击者 可以绕过防伪机制。签发者 MUST 通过受完整性保护的 通道发布见证列表凭证,并且 SHOULD 使用较短有效期并结合频繁 重新签发。
签发者是见证列表凭证的唯一作者, 并且 REQUIRED 在每次 列表更新时重新生成见证种子 (参见7.5 签发者信息泄露)。因此,签发者 可以通过发布新的见证列表凭证来否认其先前签发的凭证,在该凭证中, 那个凭证的见证缺失或被改变:对最新列表重新计算 见证的验证者会得到 不匹配结果,并拒绝一个原本真实的凭证。与伪造不同, 这种行为可由合法签发者执行,且不能仅凭该机制 防止,因为每个发布的列表都是一个 有效签名的凭证。
要求签发证据能够经受后续
否认的依赖方 SHOULD 保留(缓存或归档)
其所依赖的见证列表凭证,连同其
证明和有效期。由于每个
见证列表凭证本身都是一个带有
validFrom 值的已签名
可验证凭证,
因此,针对在
否认之前发布的列表完成验证的凭证,仍可证明其在该较早
列表时是真实的——缓存的已签名列表是持久证据,表明签发者
在当时对该凭证进行了证明。对已发布列表进行独立归档、
公证或透明日志见证,
通过使签发者的发布历史
不可否认来加强这一保证。
witnessCount 值会泄露批次中
凭证的最大数量。签发者 MUST 使用较大的集合大小(至少
131072 个条目),以确保个别持有者无法通过其在
列表中的位置被识别。此类集合中的所有槽位都必须填充,无论
用于创建见证的哈希是否对应于
可验证凭证。
获取见证列表凭证会产生一个网络请求, 可能向主机暴露正在进行验证这一事实。验证者 SHOULD 缓存见证列表凭证,并且 MAY 在获取列表时使用 保护隐私的 网络传输。签发者 SHOULD 通过 CDN 或内容寻址系统提供见证 列表,以降低关联 能力。
本文档中的示例引用 vc-forgery-defense 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"
}
}
}
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: