rblake2320/bpc-protocol
GitHub: rblake2320/bpc-protocol
BPC 是一种用设备绑定、配对验证和逐请求签名取代静态 API 密钥的多因素认证协议。
Stars: 1 | Forks: 0
# BPC -- 绑定对凭证
一种请求认证协议,其中每个 API 调用都经过设备签名、配对验证、密钥锁定和防重放保护。
## 它是什么
静态 API 密钥是一个单一字符串,任何持有它的人都可以获得完全访问权限。它们会被提交到代码仓库、在日志中泄露、被供应链攻击窃取,并且可以被无限重放。一旦 API 密钥泄露,攻击者就拥有与合法客户端相同的访问权限——而你甚至可能永远不会知道。
BPC 用一种多因素、逐请求签名的协议取代了静态密钥。每个客户端生成一个设备绑定的 ECDSA 密钥对(通过 Web Crypto API 设置为不可导出),通过显式的配对过程向服务器注册,并使用私钥、用户选择的密钥、新鲜随机数和时间戳对每个请求进行签名。被盗的凭证在没有设备密钥、密钥和新鲜随机数窗口的情况下毫无用处——必须同时具备所有条件。
## 5 层防护
| 层级 | 作用 | 防御内容 |
|-------|-------------|---------------|
| 设备绑定密钥 | 通过 Web Crypto API 以 `extractable: false` 生成的 ECDSA P-256 密钥对 | 被盗密钥在另一设备上使用——没有私钥,就没有有效签名 |
| 显式配对注册表 | 每个客户端必须在发出请求之前单独注册和审批 | 未知调用者、枚举攻击、未授权访问 |
| 用户选择的密钥 | 通过 HMAC 派生混入每个签名中的密钥——永远不会以明文形式存储或传输 | 被盗密钥 + 被盗设备——攻击者仍然缺少密钥 |
| 防重放保护 | 每个请求使用唯一随机数和 60 秒时间戳窗口 | 捕获的请求在之后重放——随机数已被使用,时间戳已过期 |
| 行为异常引擎 | 跟踪未知配对探测、签名失败、重放尝试、过期时间戳 | 探测、暴力破解、协调攻击模式 |
## 快速开始
```
cd examples/full-stack
npm install && npm start
```
这将启动一个受 BPC 保护的 Express 服务器和一个执行注册、配对和签名请求的客户端。
## 安装
```
npm install @bpc/server # server verification middleware
npm install @bpc/client-sdk # client signing SDK
```
两个包都依赖于 `@bpc/core`(会自动安装)。
## 服务器用法
```
import express from 'express';
import { PairRegistry, ServerNonceStore, AnomalyEngine, verifyBPCRequest } from '@bpc/server';
const app = express();
const registry = new PairRegistry();
const nonceStore = new ServerNonceStore();
const anomaly = new AnomalyEngine();
app.use(async (req, res, next) => {
const result = await verifyBPCRequest({
pairId: req.headers['x-bpc-pair-id'] as string,
signature: req.headers['x-bpc-signature'] as string,
signedData: req.headers['x-bpc-signed-data'] as string,
method: req.method,
path: req.path,
}, registry, nonceStore, anomaly);
if (!result.ok) return res.status(401).json({ error: result.error });
next();
});
```
## 客户端用法
```
import { BPCClient } from '@bpc/client-sdk';
import { generateKeypair, hashSecret } from '@bpc/core';
// After pairing (see spec for full flow):
const client = new BPCClient({
serverUrl: 'https://api.example.com',
pairId: 'pair_a1b2c3d4e5f6g7h8',
keypair: myKeypair,
secret: 'mySecret',
});
const response = await client.fetch('/api/data');
```
## 架构
```
packages/
core/ Crypto primitives, canonical payload, nonce generation, HMAC
server/ Pair registry, nonce store, anomaly engine, verification pipeline
client-sdk/ BPCClient with automatic request signing and fetch wrapper
```
- **`@bpc/core`** -- 共享的加密函数(ECDSA 密钥生成、签名、验证、HMAC 派生、规范化)。框架无关,可在浏览器和 Node.js 中运行。
- **`@bpc/server`** -- 验证管道(`verifyBPCRequest`)、配对注册表、服务端随机数存储和行为异常引擎。框架无关——可搭配任意 HTTP 框架使用。
- **`@bpc/client-sdk`** -- 处理请求签名和头部构建的 `BPCClient` 类。提供自动附加 BPC 头部的 `fetch()` 封装。
## 安全属性
以下属性由协议强制执行并由测试套件验证。声明范围限定于**正确实现、正确部署、正确运行**的系统。
| 属性 | 声明 | 保障方式 |
|----------|-------|--------------|
| 凭证隔离 | 被盗的 API 密钥无法从其他设备使用 | 以 `extractable: false` 生成的 ECDSA 私钥——无法被 JavaScript 导出或被受损的应用层提取 |
| 密钥绑定 | 被盗的设备在没有用户密钥的情况下无法使用 | 每个请求携带一个从 `hashSecret(secret)` 派生的 HMAC,混入签名载荷中。服务器独立于 ECDSA 签名进行验证。 |
| 重放抵抗 | 捕获的有效请求无法被重放 | 每请求加密随机数(首次使用后即被消耗)+ 60 秒时间戳窗口。两者必须同时有效。 |
| 请求体完整性 | 有效签名无法被移植到不同的请求体上 | `body_hash`(原始请求体的 SHA-256)被包含在签名的规范化载荷中。服务器计算收到请求体的哈希值并进行比对。 |
| 轮换真实性 | 密钥轮换不能仅由持有配对 ID 的攻击者发起 | 轮换载荷(`old_pair_id`、`new_pub_jwk`、`timestamp`、`purpose`)由现有设备私钥签名。服务器在接受新密钥之前验证签名和所有绑定字段。 |
| 行为检测 | 重复探测、签名失败和重放尝试被跟踪 | 异常引擎记录每个配对的威胁分数。运维人员可以基于分数阈值进行管控。 |
**BPC 不做以下声明:**
- 防护完全受损的主机(操作系统级密钥提取或密钥窃取超出协议范围)
- 硬件认证——`extractable: false` 标志防止 JS 层提取;TPM/Secure Enclave 绑定需要 WebAuthn 认证(计划于 v0.2.0)
- 抗量子性——ECDSA P-256 在密码学相关的量子计算机出现后易受 Shor 算法攻击。NIST 将在 2030 年前弃用 P-256。在此期限之前计划迁移到 ML-DSA(CRYSTALS-Dilithium,FIPS 204)。
## 状态
v1.0.0——生产级参考实现。专利申请中。
对该代码库进行了三轮独立的对抗性测试,发现并解决了以下问题:密钥 HMAC 执行漏洞、轮换载荷字段绑定、示例服务器中的请求体哈希执行、HMAC 比较时序、Redis 速率限制器中的 `Math.random()`。全部 57 个测试(core、server、client-sdk)均已通过。
设备密钥上的 `non-extractable` 标志可防止 JavaScript 层的密钥提取。对于硬件级绑定(TPM/Secure Enclave),需要通过 WebAuthn 进行平台认证,计划于 v0.2.0 实现。完整协议规范请参阅 `spec/bpc-spec-v1.md`。
## 路线图(v0.2.0)
- 持久化配对注册表(基于数据库,重启后保留)
- 多实例随机数存储(基于 Redis,适用于负载均衡部署)
- 通过 WebAuthn 实现硬件认证(TPM/Secure Enclave 密钥绑定)
- ML-DSA 迁移路径(后量子,2030 年 NIST 期限之前)
## 致谢
由 R. Blake 构思和设计。
标签:API安全, API认证, Bound Pair Credentials, BPC, ECDSA, Express, GNU通用公共许可证, HMAC, IP 地址批量处理, JSONLines, JSON输出, MITM代理, Node.js, nonce, P-256, StruQ, Web Crypto API, Web安全, 反凭证盗用, 反暴力破解, 反枚举, 多因素认证, 抗重放攻击, 无静态密钥, 时间戳, 显式配对注册, 用户自选密钥, 网络安全, 自动化攻击, 蓝队分析, 行为异常检测, 设备密钥对, 设备绑定, 请求签名, 防API密钥滥用, 防供应链攻击, 防凭证泄露, 防日志泄露, 防重放, 隐私保护, 零信任, 非可导出密钥