接口验签(Signature Verification)
什么是接口验签?
接口验签是一种验证请求或响应是否被篡改的机制。通过生成和验证签名,确保数据在传输过程中没有被篡改,并且请求确实来自合法的客户端。
验签的原理
客户端生成签名:
- 客户端使用约定的算法(如 HMAC-SHA256 或 MD5)和密钥,对请求参数进行签名。
- 签名通常基于请求的参数、时间戳、随机字符串等数据。
- 签名结果会附加到请求中(如 sign 字段)。
服务端验证签名:
- 服务端收到请求后,使用相同的算法和密钥,对请求参数重新计算签名。
- 将计算出的签名与客户端传递的签名进行比对。
- 如果一致,说明请求未被篡改;如果不一致,则拒绝请求。
验签的步骤
客户端:
- 将请求参数按一定规则排序(如按字母顺序)。
- 将排序后的参数拼接成字符串。
- 使用密钥和算法生成签名。
- 将签名附加到请求中。
服务端:
- 提取请求中的签名。
- 按相同规则对请求参数排序并拼接。
- 使用密钥和算法重新计算签名。
- 比对签名,验证请求的合法性。
示例
假设客户端发送以下请求:
{
"param1": "value1",
"param2": "value2",
"timestamp": "1698765432",
"nonce": "123456"
}客户端使用 HMAC-SHA256 和密钥 secret 对参数进行签名:
import hmac
import hashlib
params = "param1=value1¶m2=value2×tamp=1698765432&nonce=123456"
key = "secret"
signature = hmac.new(key.encode(), params.encode(), hashlib.sha256).hexdigest()生成的签名会附加到请求中:
{
"param1": "value1",
"param2": "value2",
"timestamp": "1698765432",
"nonce": "123456",
"sign": "生成的签名"
}服务端收到请求后,按相同规则重新计算签名并验证。
接口摘要(Digest)
什么是接口摘要?
接口摘要是对请求或响应内容的哈希值,用于验证数据的完整性。它确保数据在传输过程中没有被篡改。
摘要的原理
生成摘要:
- 对请求或响应的内容(如 JSON 或 XML)进行哈希计算(如 SHA-256)。
- 将哈希值附加到请求或响应中(如 digest 字段)。
验证摘要:
- 接收方对收到的内容重新计算哈希值。
- 将计算出的哈希值与传递的摘要进行比对。
- 如果一致,说明数据未被篡改;如果不一致,则拒绝数据。
摘要的步骤
发送方:
- 对请求或响应的内容进行哈希计算。
- 将哈希值附加到请求或响应中。
接收方:
- 提取请求或响应中的摘要。
- 对内容重新计算哈希值。
- 比对哈希值,验证数据的完整性。
示例
假设客户端发送以下请求:
{
"param1": "value1",
"param2": "value2"
}客户端使用 SHA-256 对请求内容进行哈希计算:
import hashlib
content = '{"param1":"value1","param2":"value2"}'
digest = hashlib.sha256(content.encode()).hexdigest()生成的摘要会附加到请求中:
{
"param1": "value1",
"param2": "value2",
"digest": "生成的摘要"
}服务端收到请求后,按相同规则重新计算摘要并验证。
接口验签 vs 接口摘要
| 特性 | 接口验签 | 接口摘要 |
| 目的 | 验证请求的完整性和真实性 | 验证数据的完整性 |
| 依赖 | 需要密钥(对称或非对称) | 不需要密钥 |
| 生成方式 | 基于参数和密钥生成签名 | 基于内容生成哈希值 |
| 验证方式 | 比对签名 | 比对哈希值 |
| 适用场景 | 确保请求来自合法客户端 | 确保数据未被篡改 |
实际应用场景
接口验签:用于身份验证和防篡改,如支付接口、API 调用。
接口摘要:用于确保数据传输的完整性,如文件上传、数据同步。
注意事项
密钥管理:验签的密钥需要严格管理,避免泄露。
时间戳和随机数:在验签中加入时间戳和随机数,防止重放攻击。
哈希算法:选择安全的哈希算法(如 SHA-256),避免使用弱算法(如 MD5)。
评论 (0)