2. API认证与鉴权:API Key与Secret Key管理、签名算法(HMAC-SHA256)、时间戳与Nonce机制、权限分级与IP白名单
说实话,API认证这块,是交易所对接里最容易出问题的地方。
我见过太多团队,代码写得挺漂亮,结果一上线就被认证卡住。要么签名算不对,要么时间戳差了那么几毫秒。嗯,今天咱们就把这块彻底讲透。
2.1 API Key与Secret Key:你的数字身份证
每个交易所都会给你两样东西:一个API Key,一个Secret Key。
API Key相当于你的用户名,是公开的。Secret Key相当于你的密码,必须严格保密。
我个人习惯把Secret Key叫做「签名密钥」——因为它不直接传输,而是用来给请求签名用的。
2.2 签名算法:HMAC-SHA256
为什么需要签名?说白了,就是为了证明「这个请求确实是你发的」。
流程大概是这样的:
- 你把请求参数拼成一个字符串
- 用Secret Key对这个字符串做HMAC-SHA256计算
- 把计算结果(签名)附在请求里发出去
- 交易所用同样的方式算一遍,对比签名是否一致
我在项目中遇到过一个问题:参数顺序不一样,签名就死活对不上。后来才发现,交易所要求参数必须按字母序排列。
来看一段典型的签名代码:
import hmac
import hashlib
import time
import requests
def create_signature(secret_key, params):
# 1. 参数按字母序排序
sorted_params = sorted(params.items())
# 2. 拼接成字符串
query_string = '&'.join([f"{k}={v}" for k, v in sorted_params])
# 3. HMAC-SHA256签名
signature = hmac.new(
secret_key.encode('utf-8'),
query_string.encode('utf-8'),
hashlib.sha256
).hexdigest()
return signature
# 使用示例
api_key = "your_api_key"
secret_key = "your_secret_key"
params = {
"symbol": "BTCUSDT",
"side": "BUY",
"type": "LIMIT",
"timeInForce": "GTC",
"quantity": 0.01,
"price": 50000,
"timestamp": int(time.time() * 1000)
}
signature = create_signature(secret_key, params)
params["signature"] = signature
headers = {"X-MBX-APIKEY": api_key}
response = requests.post(
"https://api.binance.com/api/v3/order",
headers=headers,
params=params
)
2.3 时间戳与Nonce机制
时间戳和Nonce,这两个东西是为了防止重放攻击。
什么叫重放攻击?就是坏人截获了你的请求,然后原封不动地再发一次。如果没有时间戳和Nonce,交易所就分不清哪个是真正的你。
时间戳:每个请求都带上当前时间(毫秒级)。交易所会检查这个时间戳跟服务器时间差多少。一般允许5秒内的偏差。
Nonce:一个每次请求都递增的数字。交易所会记住你上次用的Nonce,如果收到一个更小的Nonce,直接拒绝。
我曾经踩过一个坑:服务器时间跟交易所时间差了10秒。结果所有请求都被拒了。后来我加了个时间同步逻辑,每次启动时先调交易所的时间接口校准一下。
2.4 权限分级:别给太多权限
交易所的API Key一般支持权限分级。常见的有:
| 权限类型 | 说明 | 建议 |
|---|---|---|
| 只读 | 只能查询账户信息、行情数据 | 监控系统用这个就够了 |
| 交易 | 可以下单、撤单 | 交易系统必须的权限 |
| 提现 | 可以发起提币 | 建议永远不要开启 |
我个人习惯:每个API Key只给最小必要权限。比如监控系统只用只读权限,交易系统才给交易权限。提现权限?我从来不开。
2.5 IP白名单:再加一道锁
IP白名单是个好东西。你可以在交易所后台设置,只有指定的IP地址才能使用这个API Key。
这样做的好处是:就算有人偷了你的API Key,他也用不了——因为IP不对。
我建议:
- 生产环境的服务器IP一定要加到白名单里
- 开发环境可以用动态IP,但别跟生产环境用同一个Key
- 如果服务器IP变了,记得及时更新白名单
2.6 知识体系总览
下面这张图,把API认证与鉴权的核心逻辑串起来了:
你看,整个流程其实不复杂。客户端准备好参数,算好签名,发出去。服务端收到后,一层层验证:时间戳对不对?Nonce有没有重复?签名算得对不对?权限够不够?IP在白名单里吗?
哪一层没过,请求就被打回来。
好了,API认证这块就讲到这里。记住一句话:认证是安全的第一道门,门没锁好,后面做得再好都没用。