import secrets, hashlib api_key = secrets.token_hex(24) # 48字符 secret_raw = secrets.token_hex(32) # 64字符 # 服务端存储哈希 (非明文) hashed_secret = hashlib.sha256(secret_raw.encode()).hexdigest()
| 权限类型 | 范围 | 建议策略 | 白名单绑定 |
|---|---|---|---|
| 只读 (行情/账户) | GET 请求 | 仅查询,不操作 | 固定IP / 网段 |
| 交易 (下单/撤单) | POST/DELETE | 单独密钥 + 二次验证 | 办公IP + 动态OTP |
| 提币/转账 | 高风险操作 | 多签 + 人工审核 | 仅内网堡垒机 |
| 管理 (子账户/API) | 全部权限 | 仅用于紧急管理 | 物理隔离IP |
203.0.113.0/24 , 198.51.100.7perm=read, trade每个API Key 只分配必要权限。例如:
网格机器人 → 仅交易+行情;
监控脚本 → 仅只读。
图:密钥从生成到鉴权的安全链路 (双边框设计呼应整体风格)
import hmac, hashlib, time
def sign_request(secret_key, method, path, body, timestamp):
message = f"{timestamp}{method}{path}{body}"
signature = hmac.new(
secret_key.encode(),
message.encode(),
hashlib.sha256
).hexdigest()
return signature
# 请求头携带: API-Key, Timestamp, Signature
def ip_whitelist_middleware(request):
api_key = request.headers.get('API-Key')
ip = request.remote_ip
allowed_ips = get_key_bindings(api_key)
if ip not in allowed_ips:
return reject(403, "IP not allowed")
# 继续验证签名
return verify_signature(request)