Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
163 changes: 163 additions & 0 deletions 2024-shenzhen-FinTechathon/SpotOn/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,163 @@
# 影映: 利用生物特征构筑Web3.0的通行证

## 1. 项目简介

​ 本项目提出了**影映**,一种去中心化隐私保护的生物信息单点登录技术。虽然单点登录具有简化用户操作、提高用户体验等优点,但是传统单点登录存在隐私泄露、中心化风险等缺点。针对上述问题,本项目提出名为影映的去中心化隐私保护的生物信息单点登录方案,结合微众区块链、Pedersen 承诺(Pedersen Commitment)和零知识证明(zk-SNARK),通过设备本地处理生物特征数据并生成 Pedersen 承诺和零知识证明,在不泄露用户隐私的情况下,允许应用提供方通过区块链的智能合约完成认证请求和验证过程,并以此提供服务。该方案解决了用户管理和记忆大量应用账号密码的困扰,同时避免了传统单点登录所带来的隐私泄露和中心化风险。

## 2. 项目背景

​ 随着数字化转型的深入推进,互联网服务和网络应用程序的数量呈指数级增长,用户日常交互的在线平台数量也随之激增。传统上,每个应用程序都要求用户通过独立的用户名和密码进行身份认证。这种认证方式在用户体验和安全性方面都存在显著的局限性,亟需新的解决方案来提高效率和安全性。在传统的用户名和密码认证模式下,用户需要为每个应用程序创建并记忆不同的凭证。这种方式带来了以下问题:

- **认知负担增加**:管理大量的用户名和密码对用户来说是一项繁琐且容易出错的任务,导致密码疲劳。
- **安全风险提升**:为方便记忆,用户往往在多个平台重复使用相同的密码。一旦其中一个账户被攻破,其他账户也面临被侵入的风险。
- **管理复杂性**:对于组织而言,维护大量用户凭证的存储和安全也是一项艰巨的任务,增加了管理成本。

​ 单点登录(SSO)允许用户通过一次身份验证,即可访问多个受信任的应用程序和服务,如图1所示。

<img src="https://github.com/user-attachments/assets/bf59f734-ab70-411f-aa12-99a7076320c9" alt="2024-11-15-22-57-57-kisspng-single-sign-on-login-identity-management-access-co-5bb241989581b3 9409994215384088566124"/>


​ 其优势包括:

- **提升用户体验**:减少了多次登录的需要,简化了用户访问各种服务的流程。
- **增强安全性**:集中管理认证过程,便于实施统一的安全策略,如复杂密码要求和多因素认证。
- **降低管理成本**:简化了凭证管理,减少了IT部门的维护工作量。

​ 尽管SSO带来了便利,但传统的中心化SSO系统仍存在一些严重的缺陷:

- **单点故障风险**:传统SSO系统依赖于集中式的身份提供商(IdP)来进行用户认证和身份信息管理。这种集中化使得如果 IdP 发生故障、遭受攻击或出现技术问题,所有依赖该IdP的服务将无法访问,导致业务中断。集中式 IdP 成为攻击者的重点目标,容易受到字典攻击、暴力破解和网络钓鱼等攻击方式的威胁。一旦被攻破,可能导致大量用户敏感信息泄露。在没有额外安全层的情况下,传统SSO难以有效抵御现代复杂的网络攻击。

- **隐私问题**:IdP的内部运作机制对用户和服务提供商而言是黑箱,缺乏对认证过程的透明度和可验证性。用户和服务提供商必须完全信任IdP的安全实践,但无法独立验证其行为是否符合安全和隐私标准。集中式 IdP 可以轻易地追踪用户在不同服务之间的活动,收集用户数据,进行用户画像,侵犯用户隐私。用户对自己的身份数据缺乏控制权,所有信息都存储并由IdP管理,存在数据滥用的可能性。图3展示了攻击者可以获取未失效的SSO 会话令牌,进而可以进行恶意行为。

- **兼容性问题**:组织内部存在各种遗留系统和新旧应用程序,集成到统一的 SSO 框架中往往面临技术兼容性问题以及成本增加。

​ 区块链技术以其去中心化、安全性和透明度,为 SSO 系统提供了一种革新性的解决方案,能够有效克服传统SSO 的缺陷。

- **消除单点故障**:区块链的分布式架构账本技术(DLT)将数据存储在多个节点上,消除了对单一中心节点的依赖。

- **提高系统可靠性**:即使部分节点出现故障,系统仍能正常运行,保证了认证服务的高可用性。

- **增强安全性**:区块链上的数据一经写入,便难以修改或删除,防止了身份数据被恶意篡改的风险。利用公私钥加密和数字签名等密码学技术,提高了认证过程的安全强度,降低了密码泄露和被破解的可能性。由于没有中央服务器,分布式网络架构天然具有抵御分布式拒绝服务(DDoS)攻击的能力。去中心化的特性使得攻击者无法通过攻破单一节点获取大量用户数据,降低了攻击的诱惑力。

- **改善隐私保护**:通过去中心化标识符(DID)和可验证凭证(VC),用户可以自主控制自己的身份数据,决定共享哪些信息,以及何时共享。区块链支持匿名或伪匿名的交易方式,减少了用户被跟踪和画像的可能性,保护了用户的隐私。

- **增强信任与透明度**:区块链的公开账本使所有交易和操作都可被验证,增强了系统的可信度和透明度。并且通过预先定义的智能合约,自动执行认证和授权流程,减少人为干预,降低错误和欺诈的风险。

- **改进兼容性**:区块链提供统一的身份认证接口,简化了不同应用和服务之间的集成过程。基于区块链的 SSO系统更容易与其他区块链应用和传统系统进行交互,具备更强的扩展性和兼容性。

​ 因此在区块链上实现 SSO,对于提升身份认证系统的安全性、可靠性和用户隐私保护具有重要意义。

- **提高系统弹性**:去中心化架构确保了系统的高可用性和抗故障能力,避免了传统 SSO 的单点故障问题。
- **增强用户数据主权**:赋予用户对自身身份数据的控制权,符合数据隐私保护的法律法规要求,如 GDPR 等。
- **符合现代安全实践**:利用先进的密码学和去中心化技术,契合零信任(Zero Trust)安全模型的理念。
- **支持数字化转型**:为组织提供一个安全、可扩展的身份认证平台,支持越来越多的数字化服务和应用程序。

​ 基于区块链的 SSO 系统代表了身份认证领域的重大创新,具有广泛的理论意义和实际应用价值。本项目旨在利用生物特征的去中心化身份认证,在微众区块链上结合生物认证实现单点登录,分析其对提升认证系统安全性、可靠性和隐私保护的作用,为构建新一代身份认证解决方案,提升计算效率提供实践参考。

## 3. 项目方案

​ 本项目提出了**影映**,一种去中心化隐私保护的生物特征认证技术。传统的身份认证方法(如基于密码和生物特征的认证)虽然在用户体验上具有一定的优势,但在安全性、隐私性和可扩展性方面存在局限性。现有的去中心化认证方法通常依赖于间接身份验证(例如使用密码或数字签名作为认证凭据),容易受到女巫攻击(Sybil 攻击)等安全威胁。

​ 针对上述问题,本项目设计了影映方案,结合 Pedersen 承诺、同态计算和零知识证明 技术,构建了一种高效、隐私友好的生物特征认证方法。在该方案中,影映协议通过将传统的明文生物特征相似度计算,转化为基于 Pedersen 承诺形式的同态计算过程,避免了用户隐私的暴露。由于 Pedersen 承诺协议本身计算复杂度较低,该方案在保证隐私保护的同时,显著提升了认证过程的效率。

​ 为了适应去中心化的应用场景,影映协议采用了 Fiat-Shamir 启发式方法对扩展版 Pedersen 承诺协议进行了优化,实现了非交互式的同态计算。同时,该方案引入了 Groth16 零知识证明技术,生成证明以表明通过同态计算得到的生物特征差异小于指定的阈值。用户可以通过微众区块链上的智能合约(作为 Groth16 的验证者),安全地完成链上认证。

​ 影映的独特之处在于其完全去中心化设计,并通过区块链智能合约以高效方式执行认证流程。我们从理论层面对影映的安全性进行了深入分析,并在微众区块链上完成原型系统验证。实验结果表明,影映在去中心化认证场景中具备高效性、安全性和实际可行性。最后,我们基于该方案的核心技术开发了 Web 端演示平台,进一步验证了方案的适用性和可操作性。

### 3.1 方案设计

​ 项目旨在基于微众区块链实现高效且隐私保护的生物识别认证协议。为此,项目设计了影映协议,通过严格结合 Pedersen 承诺的同态加密技术和 Groth16 zk-SNARK 零知识证明算法,构建了完整的生物识别认证框架。随后,详细介绍了影映协议中认证证明的生成和验证过程,展示了其高效性与隐私保护特性。

#### 3.1.1 身份的诞生
![image](https://github.com/user-attachments/assets/9ed207de-e22f-4866-aa46-47e94885606d)

用户可以通过生物特征识别验证身份,并采用OCR技术获取用户的唯一性标识符,生成全网唯一的去中心化数字身份。


#### 3.1.2 身份认证证明

![image-20241122203950036](https://github.com/user-attachments/assets/162b0060-d850-4409-ba22-b3a6fc44b553)

在身份认证过程中,用户可以在自己的本地设备生成证明,从根源上避免数据隐私泄漏,并采用微众区块链平台进行验证,依靠智能合约获取验证结果,确保验证过程的零知识性。

![e7f644bf794c01deb3aca8fdf24ac23](https://github.com/user-attachments/assets/c31e048b-3675-4dd7-8ad8-8f0518367ced)

而具体的零知识证明电路可以参考上图。


## 4. 演示平台

### 4.1 系统架构

![1733624668154](https://github.com/user-attachments/assets/d1a6c50b-fbfb-4c16-b61a-1e19c3a3c058)


1) 界面层

​ 界面层主要是对整个系统流程的具体展现,实现用户交互界面,让用户更加清晰、便捷的来使用所设计的系统。该层使用 Vue.js 框架实现用户界面,使用 HTML 和 JavaScript 创建用户交互页面,使用 Axios 进行与后端 API 的通信,发送和接收数据与后端交互,数据通过 API 发送到后端,完成验证与存储。

2) 业务逻辑层

​ 业务逻辑层采用Java实现核心业务逻辑,并与区块链交互。该层主要是对本系统中几个核心功能的具体实现,其中包含 FaceRecognition 模块、ZK-SNARK 模块、Pedersen 模块以及地址生成模块。FaceRecognition 模块负责检测人脸以及人脸比对;ZK-SNARK 模块负责生成人脸比对相关的零知识证明 proof 和人脸欧氏距离的pedersen 承诺值;Pedersen 模块负责生成承诺和生成提供校验的数据;地址生成模块负责将用户信息上链生成地址。

3) 接口层

​ 接口层主要是将底层的一些功能封装成相应的接口,从而便于上层直接调用相应的接口来实现各式各样的应用场景。

4) 底层

​ 底层是整个中心化身份体系运作的基石,也是整个方案的运行平台。演示平台主要依托底层进行用户的注册与登录、链上认证等两个功能流程。

#### 4.2 环境依赖


**集成环境**

集成开发环境:IDEA+jdk14、Remix、python3.8(Anaconda)、Vscode、Remix、Neovim、Vue3

区块链平台:FISCO-BCOS v2.9.1 文档

软件开发工具包:Python-SDK、maven3.9.9、zokrates cli

中间件平台:WeBASE

操作系统:Linux Ubuntu 22.04 LTS、Windows

开发语言:Solidity(智能合约)、Python+java(后端开发)、HTML+CSS+JavaScript(前端开发)

#### 4.3 启动步骤

**后端启动**

1. 进入后端项目目录。

2. 执行以下命令:

```bash
mvn clean install
mvn spring-boot:run
```

3. 后端服务将启动在默认端口 `http://localhost:8080`。

**前端启动**

1. 进入前端项目目录。

2. 执行以下命令:

```bash
npm install
npm run serve
```

3. 前端服务将在 `http://localhost:8081` 启动。

**区块链启动**

1. 请参考微众区块链官网进行部署与智能合约部署。





33 changes: 33 additions & 0 deletions 2024-shenzhen-FinTechathon/SpotOn/backend/check/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr

### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/

### VS Code ###
.vscode/
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
class Homomorphic {
//#p = 67108859;
#p = 67108859n;
Add(ComA, ComB) {
return ComA * ComB % this.#p
}
Pow(Com, n) {
let res = 1n;
let quot = BigInt(n);
let rem = 0n;
let table = [];
table.push(Com);
for(let i = 1; i < 64; i++) {
table.push(table[i - 1] * table[i - 1] % this.#p);
}
for(let j = 0; j < 64; j++) {
rem = quot % 2n;
quot = quot / 2n;
if(rem == 1n) {
res = res * table[j] % this.#p;
} else {}
}
return res
}
Sub(ComA, ComB, ComC) {
if(ComB * ComC % this.#p == ComA) {
return 1
}
else {
return 0
}
}
}

export {Homomorphic};
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
/**
* File Name: Pedersen.js
* Project Name: ZeroID
* Author(s): Norton
* Creation Date: 2024-02-01
* Copyright: Copyright (C) 2024 Example Corporation. All rights reserved.
* License: This code is distributed under the MIT license.
* Modification History:
* - 2024-02-02: Initial version by Norton.
* - 2024-02-10: Minor bug fixes by Norton.
* Description: This is an implementation of Pedersen's Commitment in the multiplicative group, written
* in JavaScript language.
* Contact Information: [None]
*/

export class Pedersen {
#g;
#h;
//#p = 67108859;
#p = 67108859n;
#g_table = [];
#h_table = [];
constructor(g, h) {
this.#g = g % this.#p;
this.#h = h % this.#p;
this.#g_table.push(this.#g)
this.#h_table.push(this.#h)
for(let i = 1; i < 64; i++) {
this.#g_table.push(this.#g_table[i - 1] * this.#g_table[i - 1] % this.#p);
this.#h_table.push(this.#h_table[i - 1] * this.#h_table[i - 1] % this.#p);
}
// bebug
// console.log('g:' + this.#g + ' h:' + this.#h)
// console.log('g_table:' + this.#g_table)
// console.log('h_table:' + this.#h_table)
}
Commitment(v, r) {
let v_quot = v;
let r_quot = r;
let v_rem = 0n;
let r_rem = 0n;
let G = 1n;
let H = 1n;
for(let i = 0; i < 64; i++) {
v_rem = v_quot % 2n;
v_quot = v_quot / 2n;
r_rem = r_quot % 2n;
r_quot = r_quot / 2n;
// debug
// console.log(i + ' v_rem:' + v_rem + ' v_qout:' + v_quot);
// console.log(i + ' r_rem:' + r_rem + ' r_qout:' + r_quot);
if(v_rem == 1n) {
G = G * this.#g_table[i] % this.#p;
} else {}
if(r_rem == 1n) {
H = H * this.#h_table[i] % this.#p;
} else {}
}
return G * H % this.#p
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
{
"id": "User",
"time": "2024/11/13 19:09:43",
"proof": {
"emb": [
"0x0000000001af316d",
"0x0000000000bf27bd"
],
"cmt": {
"cmt_eq_old_json": [
"0x00000000002ae14b",
"0x00000000003af9d0"
],
"cmt_eq_new_json": [
"0x0000000003779991",
"0x000000000221d6d4"
],
"cmt_mult_json": [
"0x000000000094f08e",
"0x00000000007b0669"
]
},
"a": [
"0x0000000003609a0d",
"0x0000000002588e16"
],
"z": [
"0x000000003e83836c",
"0x00000000175d9e71",
"0x000000000f45f892",
"0x000000002c63c4ef",
"0x0000000000003e81",
"0x000000000002a2cf",
"0x0000000000538850",
"0x0000000000278921",
"0x000000004a462186",
"0x00000000013e874e",
"0x000000001f9f5997",
"0x000000001f92827b",
"0x00000000000618f6",
"0x0000000000034e9b"
],
"p": [
"0x0000000002e7386b",
"0x00000000003b5d6e",
"0x0000000001ef918f",
"0x0000000001101847",
"0x00000000039507fb",
"0x0000000001d2ae3e"
]
}
}
Loading