安全模型
Pelago 全面的安全架构,保护支付、身份与数据安全。
安全概述
API 安全
身份认证
所有 API 请求都需要通过 API 密钥进行认证:
# 请求头中的 API 密钥
curl -X POST https://api.pelago.tech/v1/payments \
-H "Authorization: Bearer pk_live_xxxxx" \
-H "X-Api-Secret: sk_live_xxxxx"
请求签名
对于敏感操作,请求需要签名:
import crypto from 'crypto';
function signRequest(
method: string,
path: string,
body: object,
secret: string
): string {
const timestamp = Date.now().toString();
const payload = `${timestamp}.${method}.${path}.${JSON.stringify(body)}`;
return crypto
.createHmac('sha256', secret)
.update(payload)
.digest('hex');
}
// 在请求头中包含签名
const signature = signRequest('POST', '/v1/payments', body, apiSecret);
headers['X-Pelago-Signature'] = signature;
headers['X-Pelago-Timestamp'] = timestamp;
速率限制
| 计划 | 请求/分钟 | 突发 |
|---|---|---|
| 沙盒 | 100 | 20 |
| 入门 | 500 | 100 |
| 商业 | 2000 | 500 |
| 企业 | 自定义 | 自定义 |
零知识证明
隐私保护验证
ZKP 允许在不暴露底层数据的情况下证明事实:
支持的证明类型
| 证明 | 可验证 | 保持隐藏 |
|---|---|---|
| 余额范围 | 拥有足够资金 | 精确余额 |
| 年龄阈值 | 年满 18/21 | 出生日期 |
| KYC 状态 | 已验证 | 个人详情 |
| 信用评分 | 评分 > X | 精确分数 |
实现示例
// 为余额验证创建 ZKP
const proof = await pelago.zkp.createProof({
type: 'balance-threshold',
threshold: 100.00,
currency: 'USDC',
walletAddress: 'GXXXXX...'
});
// 验证证明
const isValid = await pelago.zkp.verifyProof(proof);
console.log('证明有效:', isValid); // true
数据加密
静态加密
- AES-256-GCM 加密存储数据
- 通过 HSM 管理密钥
- 定期轮换密钥(90 天)
传输加密
- 所有连接使用 TLS 1.3
- 移动端 SDK 证书锁定
- 长 max-age 的 HSTS
敏感数据处理
智能合约安全
审计报告
| 审计方 | 日期 | 范围 | 状态 |
|---|---|---|---|
| Trail of Bits | 2024-Q4 | 核心合约 | ✓ 通过 |
| Certik | 2024-Q3 | PLP 合约 | ✓ 通过 |
| OpenZeppelin | 2024-Q2 | 全面审计 | ✓ 通过 |
多重签名控制
关键操作需要多个签名:
| 操作 | 所需签名 | 时间锁 |
|---|---|---|
| 合约升级 | 4/7 | 48 小时 |
| 紧急暂停 | 2/7 | 立即 |
| 费率变更 | 3/7 | 24 小时 |
| 钱包变更 | 5/7 | 72 小时 |
熔断机制
自动保护机制:
// 简化的熔断器
contract PaymentContract {
uint256 public dailyLimit = 1_000_000e6; // $1M USDC
uint256 public dailyVolume;
uint256 public lastResetDay;
modifier withinLimits(uint256 amount) {
if (block.timestamp / 1 days > lastResetDay) {
dailyVolume = 0;
lastResetDay = block.timestamp / 1 days;
}
require(dailyVolume + amount <= dailyLimit, "Daily limit exceeded");
dailyVolume += amount;
_;
}
}
Webhook 安全
签名验证
务必验证 Webhook 签名:
import crypto from 'crypto';
function verifyWebhook(
payload: string,
signature: string,
secret: string
): boolean {
const expected = crypto
.createHmac('sha256', secret)
.update(payload)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expected)
);
}
// 在你的 Webhook 处理器中
app.post('/webhook', (req, res) => {
const signature = req.headers['x-pelago-signature'];
const isValid = verifyWebhook(
JSON.stringify(req.body),
signature,
process.env.WEBHOOK_SECRET
);
if (!isValid) {
return res.status(401).send('Invalid signature');
}
// 处理 Webhook...
});
Webhook IP 白名单
Pelago Webhook 请求来源于:
34.102.xxx.xxx/2435.190.xxx.xxx/24
合规性
标准
| 标准 | 状态 |
|---|---|
| SOC 2 Type II | 已认证 |
| GDPR | 合规 |
| PCI DSS | Level 1 |
| CCPA | 合规 |
数据驻留
- 欧盟数据存储在欧盟区域
- 美国数据存储在美国区域
- 企业客户可自定义配置
事件响应
响应时间表
| 严重性 | 响应时间 | 解决目标 |
|---|---|---|
| 严重 | 15 分钟 | 4 小时 |
| 高 | 1 小时 | 24 小时 |
| 中 | 4 小时 | 72 小时 |
| 低 | 24 小时 | 1 周 |
漏洞赏金计划
| 严重性 | 奖励 |
|---|---|
| 严重 | 最高 $500,000 |
| 高 | 最高 $100,000 |
| 中 | 最高 $25,000 |
| 低 | 最高 $5,000 |
漏洞报告邮箱:[email protected]
最佳实践
- 定期轮换 API 密钥(每 90 天)
- 环境隔离:沙盒与生产使用不同密钥
- 验证 Webhook:每个请求都应验证
- 监控日志:关注异常活动
- 最小权限原则:仅授予必要权限