Python Web 开发进阶实战:可验证网络 —— 在 Flask + Vue 中实现去中心化身份(DID)与零知识证明(ZKP)认证

第一章:为什么需要可验证网络?

1.1 传统身份系统的缺陷

问题说明
  • 中心化风险| 平台掌握用户身份,可滥用或被攻破(如 Facebook 数据泄露)
  • 重复 KYC| 每个新服务都要重新提交身份证、住址等
  • 信息过曝| 验证年龄需提交完整出生日期

1.2 可验证网络三要素(W3C 标准)

  1. DID(去中心化标识符)
    • 格式:did:example:123456abcdef
    • 特性:用户创建、用户控制、无需注册机构
    • 存储:区块链 / IPFS / 去中心化存储
  2. VC(可验证凭证)
    • Issuer(发行方)签发(如政府、银行)
    • 包含Claims(声明)+Issuer 签名
    • 示例:
{ "@context": ["https://www.w3.org/2018/credentials/v1"], "type": ["VerifiableCredential", "AgeCredential"], "issuer": "did:example:gov123", "issuanceDate": "2025-01-01T00:00:00Z", "credentialSubject": { "id": "did:example:user456", "birthDate": "2000-05-20" }, "proof": { /* 签名 */ } }
  1. VP(可验证陈述)
    • 用户从多个 VC 中选择性披露信息
    • 可附加零知识证明实现最小化披露

信任模型转变
“相信平台”“验证密码学证明”


第二章:架构设计 —— DID + ZKP 全栈集成

2.1 整体流程(无密码登录)

[Vue 前端] │ ├── 1. 生成挑战(nonce) ←── [Flask 后端] │ ├── 2. 用户钱包签名 nonce + DID │ (或生成 ZK 证明) │ └── 3. 提交 VP → [Flask 验证] → 登录成功

2.2 技术栈选型

功能技术说明
  • DID 管理|ethr-did(以太坊兼容) | 支持 EVM 链
  • VC 签发/验证|veramo(JavaScript SDK) | W3C 兼容
  • ZK 电路| Circom + SnarkJS | 浏览器友好
  • 钱包连接| WalletConnect v2 | 支持多钱包
  • 后端验证| Pythonpy_did+ 自定义 ZK 验证器 |

第三章:无密码登录 —— DID 签名认证

3.1 后端:生成挑战

# routes/auth.py from flask import session import secrets @app.route('/auth/challenge') def get_challenge(): challenge = secrets.token_urlsafe(32) session['challenge'] = challenge return jsonify({"challenge": challenge})

3.2 前端:钱包签名

<script setup> import { EthereumProvider } from '@walletconnect/ethereum-provider' const connectWallet = async () => { const provider = await EthereumProvider.init({ projectId: 'YOUR_WALLETCONNECT_ID', chains: [1], methods: ['eth_requestAccounts', 'personal_sign'] }) await provider.enable() window.ethereum = provider } const loginWithDID = async () => { // 1. 获取挑战 const res = await fetch('/auth/challenge') const { challenge } = await res.json() // 2. 获取用户地址(作为 DID) const accounts = await window.ethereum.request({ method: 'eth_requestAccounts' }) const did = `did:pkh:eip155:1:${accounts[0].toLowerCase()}` // 3. 签名挑战 const signature = await window.ethereum.request({ method: 'personal_sign', params: [challenge, accounts[0]] }) // 4. 提交 VP await fetch('/auth/verify', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ did, challenge, signature }) }) } </script>

3.3 后端:验证签名

# utils/did_auth.py from ecdsa import VerifyingKey, SECP256k1 import sha3 from eth_utils import to_checksum_address def verify_did_signature(did: str, challenge: str, signature: str) -> bool: # 1. 从 DID 提取地址 if not did.startswith('did:pkh:eip155:1:'): return False address = to_checksum_address('0x' + did.split(':')[-1]) # 2. 构造签名消息(EIP-191) message = f"\x19Ethereum Signed Message:\n{len(challenge)}{challenge}" message_hash = sha3.keccak_256(message.encode()).digest() # 3. 恢复公钥 sig = bytes.fromhex(signature[2:]) # 去掉 0x vk = VerifyingKey.from_signature( sig[:-1], # 去掉恢复 ID message_hash, curve=SECP256k1, hashfunc=sha3.keccak_256 ) recovered_addr = to_checksum_address(vk.to_string('compressed')[1:]) return recovered_addr == address

优势

  • 无密码、无 OAuth 依赖
  • 用户用已有钱包即可登录

第四章:零知识证明实战 —— 年龄验证

4.1 问题定义

用户想证明自己 ≥18 岁,但不想透露具体生日。

4.2 ZK 电路设计(Circom)

// circuits/age_check.circom pragma circom 2.0.0; template AgeCheck() { signal input birthYear; // 用户私有输入 signal input currentYear; // 公共输入 signal output isAdult; // 公共输出 signal diff; diff <== currentYear - birthYear; isAdult <== diff >= 18 ? 1 : 0; } component main = AgeCheck();

4.3 编译与生成证明(前端)

# 编译电路 circom age_check.circom --r1cs --wasm --sym # 启动 SnarkJS 服务(用于可信设置) snarkjs groth16 setup age_check.r1cs pot17_final.ptau age_check_0000.zkey

4.4 浏览器中生成证明

// zk/age_prover.ts import { groth16 } from 'snarkjs' import ageCheckWasm from './age_check.wasm?url' import zkey from './age_check_0000.zkey?url' export async function generateAgeProof(birthYear: number, currentYear: number = 2025) { const { proof, publicSignals } = await groth16.fullProve( { birthYear, currentYear }, ageCheckWasm, zkey ) return { proof, publicSignals // [isAdult (0/1), currentYear] } }

4.5 后端验证证明

# utils/zk_verifier.py import json from py_ecc.bn128 import bn128_curve as curve from snarkjs import groth16_verify # 假设有 Python 绑定 def verify_age_proof(proof_json: dict, public_signals: list) -> bool: with open('verification_key.json') as f: vkey = json.load(f) return groth16_verify(vkey, public_signals, proof_json)

隐私保障

  • 后端只知道isAdult=1,不知道birthYear=2000
  • 证明不可伪造(基于椭圆曲线密码学)

第五章:可验证凭证(VC)系统

5.1 发行 VC(银行 KYC 场景)

# services/vc_issuer.py from veramo import create_verifiable_credential def issue_kyc_vc(user_did: str, name: str, birth_date: str): credential = { "@context": ["https://www.w3.org/2018/credentials/v1"], "type": ["VerifiableCredential", "KYCCredential"], "issuer": BANK_DID, "issuanceDate": datetime.utcnow().isoformat() + "Z", "credentialSubject": { "id": user_did, "name": name, "birthDate": birth_date } } return create_verifiable_credential(credential, issuer_private_key)

5.2 用户存储 VC

  • 数字钱包(如 Polygon ID Wallet)安全存储 VC
  • VC 不上链:仅 DID 文档和状态(如撤销)上链

5.3 验证 VC(第三方平台)

# routes/verify_kyc.py from veramo import verify_credential @app.route('/verify/kyc', methods=['POST']) def verify_kyc(): vp = request.json # Verifiable Presentation # 1. 验证 VC 签名 if not verify_credential(vp['verifiableCredential']): return jsonify({"error": "Invalid VC"}), 400 # 2. 检查 DID 是否在许可列表 if vp['holder']['id'] not in allowed_dids: return jsonify({"error": "Unauthorized"}), 403 return jsonify({"status": "verified"})

优势

  • 用户一次 KYC,多处复用
  • 平台无需存储敏感个人信息

第六章:前端集成 —— Vue + WalletConnect

6.1 封装 DID 登录组件

<template> <button @click="login" :disabled="loading"> {{ loading ? 'Connecting...' : 'Login with Wallet' }} </button> </template> <script setup> import { useDIDAuth } from '@/composables/didAuth' const { login, loading } = useDIDAuth() </script>

6.2 Composable 逻辑

// composables/didAuth.ts import { ref } from 'vue' export function useDIDAuth() { const loading = ref(false) const login = async () => { loading.value = true try { await connectWallet() const { challenge } = await fetchChallenge() const { did, signature } = await signChallenge(challenge) await submitVP({ did, challenge, signature }) // 登录成功,跳转 router.push('/dashboard') } finally { loading.value = false } } return { login, loading } }

用户体验:与传统“微信登录”按钮无异,但更安全、更隐私。


第七章:隐私与安全最佳实践

7.1 防重放攻击

  • 挑战(nonce)一次性+短期有效(如 5 分钟)
  • VP 中包含有效期唯一 ID

7.2 凭证撤销

  • 使用Status List 2021(W3C 标准)
  • 撤销列表存储于 IPFS,DID 文档指向最新列表

7.3 最小化披露原则

  • 默认使用ZK 证明而非原始 VC
  • 前端明确告知用户“将披露哪些信息”

第八章:性能与兼容性

8.1 ZK 证明生成时间

设备电路复杂度生成时间
  • 现代笔记本| AgeCheck(简单) | ~800ms
  • iPhone 14| 同上 | ~1.2s
  • 低端安卓| 同上 | ~2.5s

优化

  • 预加载 WASM 模块
  • 使用 Web Worker 避免阻塞 UI

8.2 钱包兼容性

钱包DID 支持VC 支持
  • MetaMask| ✅ (via Snap) | ❌
  • Polygon ID Wallet| ✅ | ✅
  • Microsoft Entra Verified ID| ✅ | ✅

策略:优先支持 Polygon ID,降级到 DID 签名。


第九章:合规与伦理

9.1 GDPR 合规

  • 用户可删除 VC:钱包本地删除,平台仅保留验证记录(无 PII)
  • 数据最小化:ZK 证明天然符合

9.2 防止歧视

  • 避免生物特征 VC:如种族、基因等敏感属性
  • 开源验证逻辑:防止隐藏偏见算法

第十章:未来方向

10.1 BBS+ 签名

  • 支持选择性披露而无需 ZK(如只出示 VC 中的“年龄”字段)
  • 工具:@mattrglobal/bbs-signatures

10.2 跨链 DID

  • 使用ENS + .eth 域名作为人类可读 DID
  • 示例:did:pkh:eip155:1:0x...alice.eth

总结:构建用户主权的身份层

可验证网络不是加密乌托邦,而是下一代互联网信任基础设施。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1183837.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ROFL-Player英雄联盟回放分析工具终极使用指南

ROFL-Player英雄联盟回放分析工具终极使用指南 【免费下载链接】ROFL-Player (No longer supported) One stop shop utility for viewing League of Legends replays! 项目地址: https://gitcode.com/gh_mirrors/ro/ROFL-Player 还在为无法直接查看英雄联盟回放文件而烦…

杭州婚纱摄影推荐综合评分排名;几大品牌打造出圈杭州婚纱照 - charlieruizvin

杭州婚庆市场近年来异常火爆,无数新人心神向往到杭州拍摄心仪的婚纱照,一生只选一次的婚纱照又怎么能不用心做选择呢!接下来我给大家整理了近两年来在杭州比较靠前的几大商家,按等级评分更好的为大家提供更细致的选…

5分钟快速上手GitHub Actions运行器镜像:终极开发环境搭建指南

5分钟快速上手GitHub Actions运行器镜像&#xff1a;终极开发环境搭建指南 【免费下载链接】runner-images actions/runner-images: GitHub官方维护的一个仓库&#xff0c;存放了GitHub Actions运行器的镜像文件及相关配置&#xff0c;这些镜像用于执行GitHub Actions工作流程中…

Nextcloud AIO部署终极指南:从零搭建全栈环境

Nextcloud AIO部署终极指南&#xff1a;从零搭建全栈环境 【免费下载链接】all-in-one The official Nextcloud installation method. Provides easy deployment and maintenance with most features included in this one Nextcloud instance. 项目地址: https://gitcode.co…

如何快速掌握IDM-VTON:虚拟试衣模型的完整教程

如何快速掌握IDM-VTON&#xff1a;虚拟试衣模型的完整教程 【免费下载链接】IDM-VTON 项目地址: https://ai.gitcode.com/hf_mirrors/ai-gitcode/IDM-VTON 虚拟试衣技术正在改变时尚行业的用户体验&#xff0c;而IDM-VTON作为基于扩散模型的先进虚拟试衣解决方案&#…

腾讯混元MT模型应用场景:中小企业本地化部署指南

腾讯混元MT模型应用场景&#xff1a;中小企业本地化部署指南 1. 引言&#xff1a;轻量级翻译模型的落地需求 随着全球化业务的不断扩展&#xff0c;中小企业对高质量、低成本的多语言翻译能力需求日益增长。传统的云端翻译API虽然使用便捷&#xff0c;但在数据隐私、响应延迟…

AirSim无人机仿真平台:完整部署指南与实战技巧

AirSim无人机仿真平台&#xff1a;完整部署指南与实战技巧 【免费下载链接】AirSim microsoft/AirSim: 一个基于 Unreal Engine 的无人机仿真平台&#xff0c;支持多平台、多无人机仿真和虚拟现实&#xff0c;适合用于实现无人机仿真和应用。 项目地址: https://gitcode.com/…

2026MBTI测试平台最新推荐,MBTI测试官网,MBTI免费测试,MBTI官方测试,MBTI在线测试,MBTI测试,中文MBTI测试平台选择指南! - 品牌鉴赏师

随着MBTI人格测评从社交潮流逐步转向职业规划、企业人才配置、高考志愿填报等严肃决策场景,中文用户对专业、精准、本土化的MBTI测试平台需求日益激增。国际心理测评协会(IPTA)与中国心理学会联合发布的《2025全球M…

Navicat x 达梦技术指引 | 数据生成

近期&#xff0c;Navicat 宣布正式支持国产达梦数据库。Navicat 旗下全能工具 支持达梦用户的全方位管理开发需求&#xff0c;而轻量化免费的 则满足小型和独立开发者的基础需求。 Navicat Premium 自版本 17.3 开始支持达梦 DM8 或以上版本。它支持的系统有 Windows、Linux …

实测Sambert多情感语音合成:中文配音效果惊艳实录

实测Sambert多情感语音合成&#xff1a;中文配音效果惊艳实录 1. 背景与需求&#xff1a;为何选择多情感中文语音合成&#xff1f; 随着人工智能在虚拟主播、智能客服、有声读物和教育辅助等领域的广泛应用&#xff0c;传统“朗读式”语音合成已难以满足用户对自然度与情感表…

Nucleus Co-Op:单机游戏变身多人同乐的终极解决方案

Nucleus Co-Op&#xff1a;单机游戏变身多人同乐的终极解决方案 【免费下载链接】nucleuscoop Starts multiple instances of a game for split-screen multiplayer gaming! 项目地址: https://gitcode.com/gh_mirrors/nu/nucleuscoop 你是否曾经遇到过这样的困境&#…

2026年济南美术高考培训指南:道北画室,1400+学员高分实证的济南画室首选 - 深度智识库

随着2026年美术高考季日益临近,济南及周边城市美术生家长和学子正面临关键抉择:如何为孩子挑选一所真正能提升联考竞争力的美术集训机构?在众多济南画室中,道北画室凭借18年深耕山东美术高考的实战经验、科学的教学…

电脑定时助手,支持定时关机等多种任务,一键设置搞定!使用完全免费~

下载链接 https://pan.freedw.com/s/r8RRFX 软件介绍 电脑定时助手&#xff0c;支持定时关机等多种任务&#xff0c;一键设置搞定&#xff01;使用完全免费~ 软件特点 定时处理任务定时各种操作定时关机等等 软件截图

效果惊艳!AutoGen Studio+Qwen3-4B生成的AI绘画案例展示

效果惊艳&#xff01;AutoGen StudioQwen3-4B生成的AI绘画案例展示 1. 背景与技术选型 随着多智能体系统&#xff08;Multi-Agent System&#xff09;在复杂任务自动化中的广泛应用&#xff0c;如何快速构建具备协作能力的AI代理成为开发者关注的核心问题。微软推出的 AutoGe…

制造业专属工具崛起:通用平台正在失效?

在过去的那几年时间里,B2B企业如果要寻找合适的工厂、进一步拓展自身客户,在这个过程中,几乎都会用到几个被大家称为“万能”的平台:可以通过1688去寻找供应商,借助企查查来查询企业背景,依靠探迹挖掘客户线索,这些平台有着广泛的覆盖面、全面的功能,并且拥有响亮的品牌…

实测通义千问3-4B:手机跑大模型的真实体验分享

实测通义千问3-4B&#xff1a;手机跑大模型的真实体验分享 1. 引言&#xff1a;为什么我们需要能在手机上运行的大模型&#xff1f; 随着生成式AI技术的快速演进&#xff0c;大语言模型正从“云端巨兽”向“端侧轻量”演进。然而&#xff0c;大多数用户仍受限于算力门槛——部…

1701RZ14003D控制器

1701RZ14003D 控制器1701RZ14003D是一款高性能、可靠性强的工业控制器&#xff0c;广泛应用于自动化生产线、过程控制系统和大型设备监控中。它以模块化、高速、实时和智能化为核心设计理念&#xff0c;具备以下主要特点&#xff1a;高速处理能力&#xff1a;采用先进处理芯片&…

汽车软件越来越复杂,测试这件事,真的不能再“靠人扛”了!

从传统 ECU,到域控制器、中央计算平台,再到 ADAS、自动驾驶、车联网,汽车正快速变成一个“装在车壳里的大型软件系统”。随之而来的,是软件规模暴涨、代码复杂度飙升,以及越来越严格的安全和合规要求。这两年,汽…

如何验证UDP传输是否已经溢出?

概要 # 方法1&#xff1a;查看 /proc/net/snmp&#xff08;推荐&#xff09; grep -A1 "Udp:" /proc/net/snmp watch -n1 grep -A1 Udp /proc/net/snmp // 设置接收缓冲区&#xff08;关键&#xff01;&#xff09; socket->setSocketOption(QAbstractSocket::…

文件名怎么批量修改?这款工具可一键批量对文件重命名,使用完全免费,有多种命名方法!

下载链接 https://pan.freedw.com/s/kRu70O 软件介绍 文件名怎么批量修改&#xff1f;这款工具可一键批量对文件重命名&#xff0c;使用完全免费&#xff0c;有多种命名方法&#xff01; 软件特点 支持多种命名方式免费使用支持批量处理 软件截图