当前位置: 首页 > news >正文

zk-SNARKs 最简单的应用示例:密码验证

场景
假设你想向某个网站证明你知道密码,但又不想直接暴露密码。这可以用零知识证明 (ZK-SNARKs) 来实现。


传统方法:

  • 你输入密码,服务器检查密码是否正确。
  • 服务器需要存储和处理你的密码,可能有泄露风险。

zk-SNARKs 方法:

  • 你生成一个证明(Proof),表明你知道正确密码。
  • 服务器验证该证明,无需知道密码本身。

实现思路

  1. 构造约束(电路)
    设计一个数学问题,确保只有知道正确密码的人才能生成有效证明。

    • 输入:秘密密码 (x)
    • 计算:哈希 (H(x))
    • 约束:(H(x) = H_expected)(服务器存储的哈希值)
  2. 生成证明(Prover)
    证明者(用户)使用 zk-SNARKs 生成一个证明,表明自己知道密码 (x) 且其哈希匹配。

  3. 验证证明(Verifier)
    服务器只需检查 zk-SNARKs 生成的证明,而无需知道密码。


代码示例(Circom + SnarkJS)

使用 Circom 定义密码验证电路:

pragma circom 2.0.0;

template PasswordCheck() {
    signal private input x;  // 用户输入的密码
    signal output valid; 

    signal expectedHash;  // 服务器存储的哈希值(硬编码或输入)

    expectedHash <== 123456789;  // 示例哈希(实际应安全存储)

    // 计算哈希并比较
    valid <== (poseidon([x]) == expectedHash);
}

component main = PasswordCheck();

执行步骤

  1. 编译电路

    circom password.circom --r1cs --wasm --sym --c
    
    
  2. 生成密钥:

    snarkjs groth16 setup password.r1cs pot12_final.ptau password_0000.zkey
    
  3. 用户生成证明:

    node password_js/generate_witness.js password.wasm input.json witness.wtns
    snarkjs groth16 prove password_0000.zkey witness.wtns proof.json public.json
    

4.服务器验证证明:

	snarkjs groth16 verify verification_key.json public.json proof.json

优点
✅ 密码不会泄露
✅ 服务器无需存储原始密码
✅ 即使服务器遭受攻击,密码仍然安全

相关文章:

  • RAG的Rerank:从期待到现实的转变
  • Mysql第二次练习
  • Swift 中 associatedtype 的用法详解
  • IntelliJ IDEA 2023.3.1安装指南从下载到配置的完整教程(附资源下载)
  • 中考英语之09从句
  • 五大基础算法——模拟算法
  • C++特性——智能指针
  • 13. 分治
  • 97.HarmonyOS NEXT跑马灯组件教程:基础概念与架构设计
  • Linux实时内核稳定性案例
  • 【Go语言圣经2.5】
  • Matlab 基于磁流变阻尼器的半主动车辆座椅悬架模糊控制研究
  • Java集合 - ArrayList
  • 向量检索在AI中的应用与技术解析
  • 数据库的高阶知识
  • 中考英语之07句子成分
  • 【leetcode hot 100 114】二叉树展开为链表
  • HTB靶机 - Dog记录
  • 【自学笔记】Solidity基础知识点总览-持续更新
  • 前端---CSS(前端三剑客)
  • 钟星建设集团网站/电脑培训网上培训班
  • 南山商城网站建设哪家公司靠谱/杭州百度首页排名
  • 怎么 从头开始建设一个网站/收录之家
  • 云桥在线客服/吉安seo网站快速排名
  • 做网站一般都是那些人 会做/360优化大师官方下载手机
  • 成都html5网站建设/短视频seo关键词