接口验签(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)。
附:现在比较流行的商用国密算法说明
SM2(加签验签的算法)
可以理解为国产RSA。非对称加密,基于ECC。该算法已公开。由于该算法基于ECC,故其签名速度与秘钥生成速度都快于RSA。
SM2椭圆曲线公钥密码算法是我国自主设计的公钥密码算法,包括SM2-1椭圆曲线数字签名算法,SM2-2椭圆曲线密钥交换协议,SM2-3椭圆曲线公钥加密算法,分别用于实现数字签名密钥协商和数据加密等功能。SM2算法与RSA算法不同的是,SM2算法是基于椭圆曲线上点群离散对数难题,相对于RSA算法,256位的SM2密码强度已经比2048位的RSA密码强度要高,但运算速度快于RSA。
SM3(degist摘要生成算法)
可以理解为国产MD5。消息摘要。可以用MD5作为对比理解。该算法已公开。校验结果为256位。
SM4(敏感数据加解密)
可以理解为国产AES。无线局域网标准的分组数据算法。对称加密,密钥长度和分组长度均为128位。
SM9
一种标识密码(IBE)算法,由国家密码管理局于2016年3月28日发布,相关标准为“GM/T 0044-2016 SM9标识密码算法”。主要用于用户的身份认证。SM9的加密强度等同于3072位密钥的RSA加密算法。
评论 (0)