AaryanBairagi/Cerebrum
GitHub: AaryanBairagi/Cerebrum
Cerebrum 是一个基于区块链和密码学的安全试卷分发系统,通过分层加密、去中心化存储和链上锚定消除试卷泄露与数据篡改风险。
Stars: 1 | Forks: 0
# Cerebrum
**基于区块链的安全试卷分发系统**
[](LICENSE)
[](https://nextjs.org)
[](https://www.typescriptlang.org)
[](https://soliditylang.org)
[](https://cerebrum-delta.vercel.app)
[](https://sepolia.etherscan.io/address/0x080a57357A2fA658237a7d77e49E3998Bb091A1C)
**[在线演示](https://cerebrum-delta.vercel.app) · [已部署合约](https://sepolia.etherscan.io/address/0x080a57357A2fA658237a7d77e49E3998Bb091A1C) · [报告 Bug](https://github.com/AaryanBairagi/Cerebrum/issues)**
## 概述
Cerebrum 是一个密码学安全的试卷管理和分发平台,通过结合现代密码学、去中心化存储和区块链验证的分层安全架构,消除了试卷泄露、内部威胁和元数据篡改。
传统的考试系统依赖于访问控制薄弱且没有防篡改证据的中心化基础设施。Cerebrum 通过以下方式解决了这个问题:
| 问题 | Cerebrum 的解决方案 |
|---|---|
| 试卷泄露 | AES-256 加密 + 定时发布 |
| 内部威胁 | 基于角色的访问控制 + 审计日志 |
| 数据篡改 | SHA-256 哈希 + RSA 数字签名 |
| 中心化故障 | IPFS 去中心化存储 |
| 缺乏问责 | 不可篡改的区块链锚定 |
| 审计追踪薄弱 | 带有实时事件流的取证审计仪表板 |
## 技术栈
### 前端
| 技术 | 版本 | 用途 |
|---|---|---|
| [Next.js](https://nextjs.org) | 16 | 全栈 React 框架,App Router |
| [React](https://react.dev) | 19 | UI 组件库 |
| [TypeScript](https://www.typescriptlang.org) | 5 | 类型安全的开发 |
| [Tailwind CSS](https://tailwindcss.com) | 4 | 实用优先的样式设计 |
| [GSAP](https://greensock.com/gsap) | 3 | 高性能动画 |
| [Three.js](https://threejs.org) | 0.184 | 3D WebGL 粒子背景 |
| [Framer Motion](https://www.framer.com/motion) | 12 | 声明式 UI 动画 |
### 后端
| 技术 | 版本 | 用途 |
|---|---|---|
| [Next.js API Routes](https://nextjs.org/docs/app/building-your-application/routing/route-handlers) | 16 | Serverless API 端点 |
| [Prisma ORM](https://www.prisma.io) | 6 | 类型安全的数据库客户端 |
| [bcryptjs](https://github.com/dcodeIO/bcrypt.js) | 3 | 密码哈希 |
| [jsonwebtoken](https://github.com/auth0/node-jsonwebtoken) | 9 | JWT 身份验证 |
### 数据库与存储
| 技术 | 用途 |
|---|---|
| [PostgreSQL](https://www.postgresql.org) | 主关系型数据库 |
| [Neon](https://neon.tech) | Serverless PostgreSQL 托管 |
| [IPFS via Pinata](https://pinata.cloud) | 去中心化加密制品存储 |
### 密码学
| 算法 | 实现 | 用途 |
|---|---|---|
| AES-256-CBC | Node.js `crypto` | 试卷的对称加密 |
| SHA-256 | Node.js `crypto` | 加密制品的完整性哈希 |
| RSA-2048 | Node.js `crypto` | 数字签名的生成与验证 |
| AES-256-CBC | Node.js `crypto` | AES 密钥和 RSA 私钥的保险库加密 |
### 区块链
| 技术 | 版本 | 用途 |
|---|---|---|
| [Solidity](https://soliditylang.org) | 0.8.28 | 智能合约语言 |
| [Hardhat](https://hardhat.org) | 2 | Ethereum 开发环境 |
| [Hardhat Ignition](https://hardhat.org/ignition) | — | 声明式合约部署 |
| [Ethers.js](https://ethers.org) | 6 | 区块链交互库 |
| [Ethereum Sepolia](https://sepolia.etherscan.io) | — | 公共测试网部署 |
## 架构

## 安全架构
| 层级 | 机制 | 实现 |
|---|---|---|
| **机密性** | 对称加密 | 每份试卷使用 AES-256-CBC |
| **密钥保护** | 保险库加密 | AES 密钥使用 `MASTER_KEY` 加密 |
| **完整性** | 密码学哈希 | 加密制品的 SHA-256 |
| **真实性** | 数字签名 | RSA-2048 签名/验证 |
| **不可篡改性** | 区块链锚定 | Sepolia 测试网,`onlyOwner` 合约 |
| **链上验证** | 解密时交叉检查 | 发布前根据链验证数据库记录 |
| **可用性** | 去中心化存储 | 通过 Pinata 使用 IPFS |
| **问责制** | 不可篡改的审计追踪 | 每一项操作均记录用户、角色、时间戳 |
| **授权** | 基于角色的访问 | 5 种角色,在每条路由上进行服务端强制执行 |
| **暴力破解保护** | IP 速率限制 | 15 分钟窗口内 10 次尝试 |
## 基于角色的访问控制
| 角色 | 注册 | 上传 | 发布 | 下载 | 审计日志 | 用户管理 |
|---|---|---|---|---|---|---|
| `SUPER_ADMIN` | 仅限管理员 CLI | ✅ | ✅ | ✅ | ✅ | ✅ |
| `EXAM_CONTROLLER` | 仅限管理员 CLI | ❌ | ✅ | ✅ | ✅ | ❌ |
| `PAPER_SETTER` | 公开注册 | ✅ | ❌ | ❌ | ❌ | ❌ |
| `AUDITOR` | 公开注册 | ❌ | ❌ | ❌ | ✅ | ❌ |
| `INVIGILATOR` | 公开注册 | ❌ | ❌ | ✅ | ❌ | ❌ |
## 智能合约
**合约地址 (Sepolia):** [`0x080a57357A2fA658237a7d77e49E3998Bb091A1C`](https://sepolia.etherscan.io/address/0x080a57357A2fA658237a7d77e49E3998Bb091A1C)
```
function storePaper(string cid, string hash, string signature) onlyOwner
function getPaper(uint256 index) view returns (cid, hash, signature, timestamp, uploadedBy)
function totalPapers() view returns (uint256)
function transferOwnership(address newOwner) onlyOwner
```
`onlyOwner` 修饰符确保只有配置好的后端钱包可以写入记录。在解密时,应用程序会读取链上记录并与数据库进行交叉核对——因此区块链在执行真正的验证工作,而不仅仅是只写日志。
## 数据库 Schema
```
User ──────────────────── Paper ─────────────────── AuditLog
│ id (uuid) │ id (cuid) │ id
│ email (unique) │ fileName │ action (enum)
│ password (bcrypt) │ encryptedAesKey │ timestamp
│ name │ vaultIv │ userId → User
│ role (enum) │ iv │ paperId → Paper
│ createdAt │ cid
│ │ hash
│ ──▶ uploadedPapers[] │ signature
│ ──▶ auditLogs[] │ publicKey
│ txHash
KeyVault │ encryptedPath
│ id │ decryptedPath (null)
│ publicKey │ uploadedAt
│ privateKey (encrypted) │ uploadedById → User
│ privateKeyIv │ unlockAt
│ createdAt │ isUnlocked
│ status (enum)
```
## 设置与安装
### 前置条件
- Node.js 20+
- PostgreSQL 数据库([Neon](https://neon.tech) 免费层即可)
- 用于 IPFS pinning 的 [Pinata](https://app.pinata.cloud) 账户
- 用于 Sepolia RPC 的 [Alchemy](https://www.alchemy.com) 账户(可选,适用于测试网)
### 本地开发
```
# 1. Clone 仓库
git clone https://github.com/AaryanBairagi/Cerebrum.git
cd Cerebrum
# 2. 安装依赖
npm install
# 3. 配置环境
cp .env.example .env
# 填写 DATABASE_URL, PINATA_JWT, JWT_SECRET, MASTER_KEY
# 4. 同步数据库 schema
npx prisma db push
# 5. 创建 Super Admin 账户
npm run create-admin
# 6. 启动本地 blockchain(独立终端)
npx hardhat node
# 7. 编译并部署 contract 到本地网络
npx hardhat compile
npx hardhat run lib/scripts/deploy.js --network localhost
# → 将打印出的地址复制到 .env 中作为 CONTRACT_ADDRESS
# → 设置 RPC_URL=http://127.0.0.1:8545
# 8. 启动 app
npm run dev
```
访问 `http://localhost:3000` 并使用超级管理员账户登录。
### 测试网部署 (Sepolia)
```
# 添加到 .env:
# SEPOLIA_RPC_URL=https://eth-sepolia.g.alchemy.com/v2/your-key
# PRIVATE_KEY=0xYourThrowawayWalletKey(使用 sepoliafaucet.com 的免费 ETH 资金)
npx hardhat ignition deploy ignition/modules/Cerebrum.js --network sepolia
# → 将打印出的地址复制到 .env 中作为 CONTRACT_ADDRESS
# → 将 RPC_URL 设置为相同的 Alchemy URL
# 运行 contract 测试
npx hardhat test
```
### 环境变量
| 变量 | 必需 | 描述 |
|---|---|---|
| `DATABASE_URL` | ✅ | PostgreSQL 连接字符串 |
| `PINATA_JWT` | ✅ | 用于 IPFS 上传的 Pinata API JWT |
| `JWT_SECRET` | ✅ | 用于签署 auth token 的密钥 |
| `MASTER_KEY` | ✅ | 用于保险库加密的 64 字符十六进制密钥 |
| `RPC_URL` | ✅ | Ethereum RPC 端点(本地或 Sepolia) |
| `PRIVATE_KEY` | ✅ | 后端钱包私钥(对于测试网为一次性的) |
| `CONTRACT_ADDRESS` | ✅ | 已部署的 Cerebrum 合约地址 |
| `SEPOLIA_RPC_URL` | 可选 | 用于测试网部署的 Alchemy/Infura Sepolia URL |
| `CONTRACT_OWNER_ADDRESS` | 可选 | 覆盖部署脚本中的部署者地址 |
## 当前状态与已知权衡
这是一个可运行的、完整的全生命周期演示:
**加密 → 签名 → 固定 → 锚定 → 时间限制 → 链上验证 → 解密 → 流式传输**
| 功能 | 状态 |
|---|---|
| AES-256 试卷加密 | ✅ 生产级质量 |
| RSA-2048 数字签名 | ✅ 生产级质量 |
| IPFS 去中心化存储 | ✅ 生产级质量 |
| 区块链锚定 (Sepolia) | ✅ 实时部署的合约 |
| 解密时的链上验证 | ✅ 已实现 |
| 内存缓冲区流式传输(无磁盘写入) | ✅ 已实现 |
| 基于 IP 的登录速率限制 | ✅ 已实现 |
| 静态加密的 RSA 私钥 | ✅ 已实现 |
| 角色门控的管理员和审计员仪表板 | ✅ 已实现 |
| `onlyOwner` 智能合约访问控制 | ✅ 已实现 |
| 基于 Redis 的速率限制 | ❌ 仅有内存实现(重启后重置) |
| 纯 httpOnly cookie 身份验证 | ❌ JWT 也存储在 localStorage 中 |
| 多节点网络 | ❌ 设计上为单链 |
## 未来增强计划
- [ ] 多重签名审批工作流
- [ ] 硬件安全模块 (HSM) 集成
- [ ] 用于私钥管理的 Cloud KMS
- [ ] 用于多实例部署的基于 Redis 的速率限制
- [ ] 零知识证明验证
- [ ] 基于人工智能的审计流异常检测
- [ ] 多提供商 IPFS 复制
- [ ] 迁移至 Hyperledger Fabric 以支持私有联盟链
## 许可证
MIT — 详见 [LICENSE](./LICENSE)。
作为生产级安全考试基础设施的学术/作品集演示而构建。在考虑投入生产使用之前,请参阅上方的“当前状态与已知权衡”。
由 Aaryan Bairagi 构建
标签:CVE, 加密存储, 区块链, 教育系统, 数字签名, 智能合约, 测试用例, 自动化攻击