密钥管理
助记词规范
BIP39 标准
| 约束级别 | 要求 |
|---|---|
| MUST | 遵循 BIP39 标准生成助记词 |
| MUST | 支持 12 词 (128 bits) 和 24 词 (256 bits) |
| MUST | 使用标准英文词库 |
| MAY | 支持其他语言词库 |
词数与安全性
| 词数 | 熵 (bits) | 安全级别 |
|---|---|---|
| 12 | 128 | 标准 |
| 15 | 160 | 高 |
| 18 | 192 | 很高 |
| 24 | 256 | 最高 |
助记词验证
| 约束级别 | 要求 |
|---|---|
| MUST | 验证单词是否在标准词库中 |
| MUST | 验证校验和是否正确 |
| MUST | 验证词数是否符合标准 |
| SHOULD | 提示相似但错误的单词 |
多链地址派生
派生架构
助记词
│
▼
种子 (Seed)
│
├──────────────────────────────────────┐
│ │
▼ ▼
BIP32/BIP44 Ed25519
(外部链) (BioForest 链)
│ │
├── Ethereum (m/44'/60'/0'/0/x) ├── BFMeta
├── Bitcoin (m/44'/0'/0'/0/x) ├── PMChain
├── Tron (m/44'/195'/0'/0/x) └── CCChain
└── BSC (m/44'/60'/0'/0/x)BIP44 派生规范
| 链类型 | Coin Type | 派生路径 |
|---|---|---|
| Ethereum | 60 | m/44'/60'/0'/0/x |
| Bitcoin | 0 | m/44'/0'/0'/0/x |
| Tron | 195 | m/44'/195'/0'/0/x |
| BSC | 60 | m/44'/60'/0'/0/x |
BioForest 派生
| 约束级别 | 要求 |
|---|---|
| MUST | 从种子派生 Ed25519 私钥 |
| MUST | 支持链前缀区分不同网络 |
| SHOULD | 使用 SHA256(seed + index) 作为私钥种子 |
加密存储规范
存储数据结构
| 字段 | 类型 | 加密 | 说明 |
|---|---|---|---|
| id | string | 否 | 钱包唯一标识 |
| name | string | 否 | 钱包名称 |
| encryptedMnemonic | EncryptedData | 是 | 加密的助记词 |
| chainAddresses | ChainAddress[] | 否 | 各链地址 |
| createdAt | number | 否 | 创建时间 |
| isBackedUp | boolean | 否 | 是否已备份 |
加密数据结构
typescript
interface EncryptedData {
ciphertext: string // Base64 编码的密文
iv: string // Base64 编码的初始向量
salt: string // Base64 编码的盐
iterations: number // 密钥派生迭代次数
}加密算法规范
| 用途 | 算法 | 参数 |
|---|---|---|
| 对称加密 | AES-256-GCM | 256-bit key, 96-bit IV |
| 密钥派生 | PBKDF2 | SHA-256, 100,000+ iterations |
加密要求
| 约束级别 | 要求 |
|---|---|
| MUST | 使用 AES-GCM 模式(提供认证加密) |
| MUST | 使用随机生成的 IV(每次加密不同) |
| MUST | 使用随机生成的 Salt(每个钱包不同) |
| MUST | 使用高迭代次数的 PBKDF2(≥100,000) |
| MUST NOT | 存储明文助记词或私钥 |
密钥使用流程
创建钱包流程
用户绘制图案
│
▼
验证图案复杂度(至少4点)
│
▼
生成助记词 (BIP39)
│
▼
显示助记词让用户备份
│
▼
验证用户备份(随机选词确认)
│
▼
加密助记词 (AES-GCM)
│
▼
从助记词派生各链地址
│
▼
存储加密数据到安全存储签名交易流程
用户确认交易
│
▼
绘制图案 / 生物识别验证
│
▼
解密助记词
│
▼
派生对应链的私钥
│
▼
签名交易
│
▼
清除内存中的私钥 ← 关键安全步骤
│
▼
广播交易图案锁规范
图案复杂度要求
| 规则 | 要求 | 约束级别 |
|---|---|---|
| 最少连接点 | 4 个 | MUST |
| 最多连接点 | 9 个 | 3x3 网格 |
图案验证规范
| 约束级别 | 要求 |
|---|---|
| MUST | 在客户端验证图案复杂度 |
| MUST NOT | 将图案明文发送到服务器 |
| SHOULD | 提供连接点数实时显示 |
| MAY | 支持图案可见性切换 |
内存安全
清除敏感数据
| 约束级别 | 要求 |
|---|---|
| MUST | 使用后立即清除敏感数据 |
| MUST | 用随机数覆盖内存(不只是置零) |
| SHOULD | 限制私钥在内存中的存在时间 |
| SHOULD | 使用安全的内存分配(如可用) |
typescript
function clearSensitiveData(data: Uint8Array): void {
// 用随机数覆盖
crypto.getRandomValues(data);
// 再次覆盖为零
data.fill(0);
}防暴力破解
| 错误次数 | 响应 |
|---|---|
| 1-3 | 正常提示 |
| 4-5 | 增加 30s 延迟 |
| 6-9 | 增加 5min 延迟 |
| 10+ | 锁定 24 小时 |
备份与恢复
备份验证规范
| 约束级别 | 要求 |
|---|---|
| MUST | 创建钱包时强制显示助记词 |
| MUST | 随机选择 2-3 个词位置让用户确认 |
| SHOULD | 标记钱包是否已完成备份 |
| SHOULD | 未备份钱包显示提醒 |
恢复流程
用户输入助记词
│
▼
验证助记词格式和校验和
│
▼
用户设置新密码
│
▼
加密助记词
│
▼
重新派生所有链地址
│
▼
创建钱包记录