# Zero_knowledge_range_proof **Repository Path**: gshhshh/zero_knowledge_range_proof ## Basic Information - **Project Name**: Zero_knowledge_range_proof - **Description**: 零知识范围证明,通过rust语言和Ursa 库编写,要求验证者输入身份证号后能在不暴露具体信息,保护隐私的情况下证明自己的年龄是否已满18岁。 - **Primary Language**: R - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 0 - **Created**: 2023-03-09 - **Last Updated**: 2024-10-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # zero-knowledge-range-prooof #### 介绍 ```bash 使用Rust实现的应用于零知识范围证明程序,前端采用最新vue开发前端,经过少量修改实现。 主要修改是api路径的,以及表格或表单的字段绑定(因为rust的命名规范的要求进行了一些字段的修改)。 zero-proof,主要是实现了对用户登录证明,采用身份认证以及要求满足18周岁以上方可使用的系统管理功能,以及登录和用户中心。 对于其它部分的功能,可能会在后续的版本中进行实现。 ``` #### 实现思路 ```bash 1. 前后端数据交互,mysql作为数据管理中心,前端页面展示逻辑,vue搭载node平台部署生成 # 在zero-proof-web中的src/views/system下进行页面配置 # 数据获取通过调用用src/api内访问后端utils文件夹下内容 # 页面排版布局在src/layout文件夹下,主要对页面主体框架设计 # 页面调用以动态路由形式实现,主要在src/router文件夹下 # 模块组件化设计,各部分子功能报表等,主要设计在src/components文件夹下 ``` ```bash 2. rust作为数据处理中心,事件调用,接口配置,数据字段获取,跨域请求,身份认证等 # 数据字段获取逻辑主要在zero-proof-rust/src/entity文件夹下,通过关键字获取数据库数据内容 # 事件处理调用逻辑在src/handler文件夹下,主要实现对各子菜单页面数据处理 # src/query文件夹主要工作是处理字典监控数据日志、用户菜单展示、权限分配等 ``` ```bash 3. mysql数据库实现各部分功能数据库表,rust通过数据库表字段进行处理,返回前端页面展示 # utils文件夹下是与前端api同步仓库,通过和api适配进行数据的传输 4. 身份认证包括身份证号码获取、身份证号码识别、身份证位数/日期等通过正则表达式调用 # 身份认证主要通过类方式实现,具体逻辑在main.rs文件中 [1]fn get_birthate(id_card:&str) ->Option {} //获取匹配身份证号码中的出生日期 ``` ```bash 5. 身份认证成功后会进入零知识证明算法框架,通过认证采集到身份证号码与当前时间差值作为年龄衔接 # 零知识证明算法框架 [1] let now = Utc::now();//现在系统的具体时间精度达到毫秒级别 let current_date = now.num_days_from_ce() / 365;//当前系统天数 /365即为当前年份 :type is i32 let age = current_date - prov.parse::().unwrap();// 通过比较获取具体年龄 [2] let (cred_pub_key, cred_priv_key, cred_key_correctness_proof) = Issuer::new_credential_def(&credential_schema, &non_credential_schema, true).unwrap();//创建相关秘钥 [3] let mut credential_values_builder = Issuer::new_credential_values_builder().unwrap(); credential_values_builder.add_dec_known("age", age.to_string().as_str()).unwrap();//i32 转 string 类型 age.to_string() let cred_values = credential_values_builder.finalize().unwrap();//获取年龄样本 [4] let mut sub_proof_request_builder = Verifier::new_sub_proof_request_builder().unwrap(); sub_proof_request_builder .add_predicate("age", "GE", 18) .unwrap(); //与18周岁比较,超过就创建证明 [5] let is_valid = proof_verifier.verify(&proof, &proof_request_nonce).unwrap(); let generator = Generator::new().unwrap(); let sign_key = SignKey::new(None).unwrap(); let ver_key = VerKey::new(&generator, &sign_key).unwrap();//证明相关校验及秘钥生成 6. 年龄超过18周岁为合法年龄,证明算法生成秘钥,认证成功 [1] println!("Verity successful to zero_kownledge_range_proof!");//提示认证成功 [2] start_web_server(&conf.webserver_conf).await//开启服务进行登录,不然无法登录 ``` #### 软件架构 zero-prooof采用actix-web作为基础的WEB框架进行开发,而在ORM方面采用了Rbatis,目前暂时使用mysql来缓存相应的数据。 #### 重点组件 1. actix-web 2. rbatis 3. chimes-auth,基于actix-web的MiddleWare提供的权限管控的功能。 4. jsonwebtoken 5. rbatis-generator,这是另一个开源的用于生成rbatis为基础的rust源码 #### 特别说明 1. 关于zero-proof前端,本应用不是为了提供更好的使用服务,所做的修改都是为了与后台进行对接,所以是尽可能少的修改它。 2. zero-proof的大部分后端代码是采用rbatis-generator进行生成的,基本上达到85%。 3. 对该项目感兴趣的,可以进仓库:https://gitee.com/gshhshh/zero_knowledge_range_proof 看看。 #### 安装教程 1. 创建数据proof,并导入数据 sql/proof.sql; 2. 编译 zero-knowledge-range-prooof/zero-proof-rust,可以进入该目录后,直接执行cargo run 3. 打包前端 zero-knowledge-range-prooof/zero-proof-web 4. 后端的一些配置可以修秘诀zero-knowledge-range-prooof/zero-proof-rust/conf/app.yml #### 指导说明 ##### 需要搭建mysql数据库 (不建议搭建在windows平台) ```bash # [1] 依次执行下面的语句 sudo apt-get autoremove --purge mysql-server sudo apt-get remove mysql-server sudo apt-get autoremove mysql-server sudo apt-get remove mysql-common ``` ```bash # [2]清理残留数据 dpkg -l |grep ^rc|awk '{print $2}' | sudo xargs dpkg -P # [3]安装mysql教程 # 更新列表 sudo apt-get update # 服务端 sudo apt-get install mysql-server # 客户端 sudo apt-get install mysql-client ``` ```bash # [4]配置mysql数据库 # 初始化 sudo mysql_secure_installation # 测试服务启动 systemctl status mysql.service # 启动服务 sudo service mysql start # 重启服务 sudo service mysql restart # 开机自启动 sudo service mysql enable # 停止服务 sudo service mysql stop ``` ```bash # [5]登录数据库 # 登录操作 密码初始化的密码需要记住 mysql -u root -p ~~~~bash #如果这样数据库还是没法登录,那么可以尝试如下方式 sudo cat /etc/mysql/debian.cnf # 这个可以查看默认用户名user 和密码password # 然后执行如下命令进行登录 mysql -u debian-sys-maint -p # 密码就是上面看到的password # 进入到mysql里面可以执行如下 show databases;# 查看数据库 # 执行创建数据库如下 create database proof; # 使用proof数据库如下 use proof; # 导入需要的数据库表可以操作如下 source 数据库表路径.sql ~~~~ # 修改密码方式 alter user 'root'@'localhost' identified by '123456'; ``` ```bash # [6]创建数据库及导入数据 # 刷新授权 flush privileges; # 查看数据库 show databases; # 创建数据库 create database proof; # 使用创建的数据库 use proof; # 查看数据库表 show tables; # 这里导入数据库表操作 不要加分号 source ../../../chinmes.sql ``` ##### 需要安装nodejs进行前端部署 ```bash # [1]安装nodejs教程 curl -sL https://deb.nodesource.com/setup_9.x | sudo -E bash - sudo apt-get install -y nodejs ~~~~bash # 如果执行node -V 或npm -V 没有版本可使用如下方式 ~~~~ sudo apt-get install nodejs-legacy nodejs sudo apt-get install npm ``` ```bash # [2]导入相关依赖 ~~~~bash # 进入前端web工程检查package.json文件是否存在 然后执行如下 ~~~~ npm install # 开启服务 npm run dev # 开启编译 npm run build ``` ##### 需要安装rust进行后端部署 ```bash # [1]查看rust版本信息 (可选) snap info rustup # [2]安装rust教程 ~~~~bash # (--classic是屏蔽风险提示) ~~~~ sudo snap install rustup --classic # [3]安装cargo等相关依赖 rustup install stable # 查看当前版本 rustc --version # 查看cargo 版本 cargo --version # [4]进入rust构建项目查看Cargo.toml文件是否存在 然后执行如下 # 开启运行服务 cargo r 或 cargo run ~~~~bash # windows 平台下安装后编译启动服务会提示报错openssl-sys 版本路径链接不到 需要安装windows的vcpkg去构建依赖 # 但目前官网对vcpkg下载部署不是十分方便,所以不建议windows平台操作 # 或许还是选择windows平台,那还需要winGM msys2工具,因为解决了上述问题还存在新的其他问题就需要使用pacman -S 安装库 去安装 ~~~~ # 开启编译 cargo buld ``` #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request 5. 身份认证搭载zkps算法