建去中心化身份應(yīng)用:DID與可驗(yàn)證憑證完整實(shí)戰(zhàn)教程)
用PyLD構(gòu)建去中心化身份應(yīng)用DID與可驗(yàn)證憑證完整實(shí)戰(zhàn)教程【免費(fèi)下載鏈接】pyldJSON-LD processor written in Python項(xiàng)目地址: https://gitcode.com/gh_mirrors/py/pyld什么是PyLD為什么它能撐起去中心化身份應(yīng)用 PyLD 是 Python 生態(tài)中最成熟的 JSON-LD 處理器也是構(gòu)建去中心化身份DID與可驗(yàn)證憑證Verifiable Credential簡(jiǎn)稱(chēng) VC應(yīng)用的關(guān)鍵基礎(chǔ)設(shè)施。DID 文檔、可驗(yàn)證憑證、可驗(yàn)證表達(dá)VP這些 W3C 標(biāo)準(zhǔn)數(shù)據(jù)本質(zhì)上都是一種 JSON-LD 文檔。想要在 Python 項(xiàng)目中正確解析、擴(kuò)展、簽名驗(yàn)證它們就繞不開(kāi) PyLD 這個(gè)底層引擎。本篇教程將從零開(kāi)始帶你理解 DID 與可驗(yàn)證憑證的數(shù)據(jù)結(jié)構(gòu)并手把手用 PyLD 完成憑證簽發(fā)、規(guī)范化、哈希驗(yàn)證的完整閉環(huán)。全程面向新手即使你只寫(xiě)過(guò)基礎(chǔ)的 Python也能跟著跑通。先搞懂三件事DID、VC、JSON-LD 的關(guān)系 在寫(xiě)代碼之前先建立三個(gè)核心概念概念一句話(huà)解釋示例DID去中心化標(biāo)識(shí)符類(lèi)似身份證號(hào)由你完全掌控did:key:z6Mk...DID 文檔描述 DID 的公開(kāi)信息含公鑰、驗(yàn)證方法、服務(wù)端點(diǎn)JSON-LD 文檔VC可驗(yàn)證憑證可被密碼學(xué)驗(yàn)證的電子憑證如學(xué)位證、駕照J(rèn)SON-LD 文檔JSON-LD 的價(jià)值在于它把普通 JSON 數(shù)據(jù)接上語(yǔ)義網(wǎng)通過(guò)context把字段名映射到標(biāo)準(zhǔn) URI。而PyLD 就是負(fù)責(zé)完成這套映射的翻譯官——把人類(lèi)易讀的短字段翻譯成機(jī)器可驗(yàn)證的完整 IRI為后續(xù)簽名驗(yàn)證鋪路。最快速的安裝步驟一條 pip 命令搞定 ?PyLD 支持 Python 3.10 及以上版本安裝非常簡(jiǎn)單pip install PyLD如果你需要遠(yuǎn)程加載上下文建議同時(shí)安裝請(qǐng)求庫(kù)PyLD 的文檔加載器依賴(lài)它pip install PyLD[requests]安裝完成后可以用一行代碼驗(yàn)證環(huán)境是否就緒from pyld import jsonld print(jsonld.expand({context: https://www.w3.org/ns/did/v1, id: did:example:123})) 提示PyLD 的核心處理邏輯都集中在lib/pyld/jsonld.py后續(xù)你提到的所有 API 都能在這個(gè)文件里找到源碼實(shí)現(xiàn)。用 PyLD 解析 DID 文檔從壓縮到展開(kāi) DID 文檔通常以壓縮compact形式存儲(chǔ)字段是短名稱(chēng)。PyLD 的expand方法會(huì)把它們還原成完整 IRI這一步是后續(xù)一切驗(yàn)證的前提。來(lái)看一個(gè)真實(shí)場(chǎng)景——解析一份 DID 文檔from pyld import jsonld did_doc { context: https://www.w3.org/ns/did/v1, id: did:example:123, verificationMethod: [{ id: did:example:123#keys-1, type: Ed25519VerificationKey2020, controller: did:example:123, publicKeyMultibase: z6Mk... }] } expanded jsonld.expand(did_doc) print(expanded)執(zhí)行后verificationMethod會(huì)被展開(kāi)為https://w3id.org/security#verificationMethodpublicKeyMultibase等字段也會(huì)被映射到標(biāo)準(zhǔn)定義。這正是可驗(yàn)證憑證驗(yàn)證時(shí)需要的規(guī)范化數(shù)據(jù)??沈?yàn)證憑證的簽發(fā)掌握normalize這個(gè)核心 API ??簽發(fā)可驗(yàn)證憑證時(shí)一個(gè)重要問(wèn)題是同一份憑證不同人解析可能得到略微不同的 JSON如何保證簽名的唯一性答案就是RDF 規(guī)范化Canonicalization。PyLD 實(shí)現(xiàn)了 W3C 的 URDNA2015 算法通過(guò)normalize方法把憑證轉(zhuǎn)成唯一的、規(guī)范化的 N-Quads 文本任何等價(jià)寫(xiě)法都會(huì)得到完全相同的結(jié)果vc { context: [ https://www.w3.org/2018/credentials/v1, https://www.w3.org/2018/credentials/examples/v1 ], id: http://example.edu/credentials/1872, type: [VerifiableCredential, UniversityDegreeCredential], issuer: did:example:issuer, issuanceDate: 2010-01-01T19:23:24Z, credentialSubject: { id: did:example:holder, degree: {type: BachelorDegree, name: 計(jì)算機(jī)科學(xué)} } } normalized jsonld.normalize( vc, {algorithm: URDNA2015, format: application/n-quads} ) print(normalized)規(guī)范化后的 N-Quads 文本就是簽名的輸入。你可以用任意密碼學(xué)庫(kù)如cryptography對(duì)其做摘要和簽名然后把簽名放進(jìn)憑證的proof字段。驗(yàn)證時(shí)反向操作解析憑證 →normalize→ 驗(yàn)簽。整個(gè)流程 PyLD 只負(fù)責(zé)數(shù)據(jù)規(guī)范化這一環(huán)職責(zé)清晰、代碼可控。 相關(guān)源碼規(guī)范化實(shí)現(xiàn)位于lib/pyld/canon.pyN-Quads 序列化位于lib/pyld/nquads.py。離線(xiàn)安全實(shí)踐用 FrozenDocumentLoader 加載 DID 與 VC 上下文 真實(shí)應(yīng)用中最常見(jiàn)的坑是憑證里的context指向公網(wǎng) URL運(yùn)行時(shí)需要聯(lián)網(wǎng)拉取上下文一旦網(wǎng)絡(luò)波動(dòng)或 URL 失效驗(yàn)證就會(huì)失敗。PyLD 內(nèi)置了FrozenDocumentLoader它從本地白名單提供上下文完全不需要聯(lián)網(wǎng)天然適合生產(chǎn)環(huán)境的離線(xiàn)驗(yàn)證與安全加固。更貼心的是PyLD 官方已經(jīng)打包了 DID、VC 等高頻上下文內(nèi)置上下文 URL用途https://www.w3.org/ns/did/v1DID 文檔https://www.w3.org/2018/credentials/v1可驗(yàn)證憑證 v1https://www.w3.org/ns/credentials/v2可驗(yàn)證憑證 v2https://w3id.org/security/v2安全術(shù)語(yǔ)proof 等使用方式非常簡(jiǎn)潔from pyld import jsonld, FrozenDocumentLoader loader FrozenDocumentLoader() # 使用內(nèi)置上下文集合 jsonld.set_document_loader(loader) # 之后所有 expand / normalize 都不會(huì)發(fā)起網(wǎng)絡(luò)請(qǐng)求 expanded jsonld.expand(vc)內(nèi)置上下文的 JSON 文件就存放在lib/pyld/documentloader/frozen/bundled/目錄下你可以直接查看甚至替換為自己的上下文。這種方式既保證了驗(yàn)證結(jié)果可復(fù)現(xiàn)也避免了供應(yīng)鏈上的隱私泄露風(fēng)險(xiǎn)。完整實(shí)戰(zhàn)流程從 DID 文檔到可驗(yàn)證憑證驗(yàn)證 把前面所有知識(shí)點(diǎn)串起來(lái)一個(gè)標(biāo)準(zhǔn)的去中心化身份應(yīng)用流程如下簽發(fā)階段構(gòu)造 DID 文檔與 VC →jsonld.normalize()規(guī)范化 → 對(duì) N-Quads 做簽名 → 寫(xiě)入proof字段傳輸階段憑證以 JSON-LD 壓縮格式傳遞體積小、易讀驗(yàn)證階段jsonld.expand()展開(kāi)憑證 → 校驗(yàn)context完整 →normalize()再次規(guī)范化 → 用 DID 文檔中的公鑰驗(yàn)簽安全加固全程使用FrozenDocumentLoader杜絕遠(yuǎn)程上下文注入風(fēng)險(xiǎn)新手最容易踩的 3 個(gè)坑 ?上下文不匹配簽發(fā)和驗(yàn)證時(shí)context必須完全一致否則normalize結(jié)果不同、驗(yàn)簽失敗忘記展開(kāi)直接對(duì)壓縮形式做簽名是不安全的務(wù)必先expand再normalize算法參數(shù)寫(xiě)錯(cuò)normalize必須指定algorithm: URDNA2015和format: application/n-quads這是 W3C 標(biāo)準(zhǔn)的默認(rèn)組合總結(jié)PyLD 是通往 Web3 身份世界的鑰匙 通過(guò)本篇教程你已經(jīng)掌握了用 PyLD 構(gòu)建去中心化身份應(yīng)用的核心鏈路理解 JSON-LD → 安裝 PyLD → 展開(kāi) DID 文檔 → 規(guī)范化并簽發(fā)可驗(yàn)證憑證 → 離線(xiàn)安全驗(yàn)證。PyLD 雖然只做數(shù)據(jù)處理這一件事但它處于 DID/VC 技術(shù)棧的底層是任何 Python 身份方案都繞不開(kāi)的基石。后續(xù)你可以在此基礎(chǔ)上集成密碼學(xué)庫(kù)實(shí)現(xiàn)完整簽名或通過(guò) PyLD 的frame、to_rdf等方法探索更多數(shù)據(jù)互操作場(chǎng)景。去中心化身份的旅程就從跑通上面的第一段normalize代碼開(kāi)始吧【免費(fèi)下載鏈接】pyldJSON-LD processor written in Python項(xiàng)目地址: https://gitcode.com/gh_mirrors/py/pyld創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考