基于摘要认证的第三方接口调用方案
{
"credential": "key:46d47e6c6d8e0c826e214447f80627b6e527c0bfa52323332adb6479c639b5ee=version:v1",
"page_size": 10,
"page": 1
}
上述请求体中的 credential 字段即为摘要凭证。其格式为 key:<hash>=version:v1,其中 key: 后的十六进制字符串是通过 SHA-256 算法计算的 client_id 摘要值,version:v1 表示认证方案版本。版本号指导服务器选择对应的验证算法。
- 工作流程概括:
- 注册阶段:服务平台为每个第三方系统分配唯一的 client_id,并保存该第三方的身份标识及其被授权的接口权限列表。
- 请求阶段:第三方系统调用受保护的API时,在请求数据中加入按照规定算法生成的
credential字段。 - 校验阶段:服务器从
credential中识别版本号,采用对应的验证算法(v1 版本采用 SHA-256 摘要比对),检查提供的摘要是否与某个已注册 client_id 的摘要匹配。 - 授权阶段:身份验证成功后,服务器查验调用方的权限配置。两项检查均通过后方允许请求继续执行。
这一设计是轻量级的:确认身份仅需一次摘要计算和比对。平台可在数据库中直接添加新的第三方或修改其权限配置,无需重新部署代码。
认证字段生成方法
import hashlib
client_id = "alpha_secret" # 示例客户端密钥
digest = hashlib.sha256(client_id.encode('utf-8')).hexdigest()
credential = f"key:{digest}=version:v1"
print(credential)
服务器端认证与授权流程
import hashlib
clients_db = {
"alpha_system": {
"secret": "alpha_secret",
"permissions": ["service:getUserContact", "data:listRecords"]
}
}
def check_credential(credential_str, required_permission):
try:
hash_part, version_part = credential_str.split('=', 1)
version = version_part.split(':', 1)[1]
provided_hash = hash_part.split(':', 1)[1]
except Exception:
return False, "格式错误"
if version != "v1":
return False, "版本不支持"
for name, info in clients_db.items():
expected_hash = hashlib.sha256(info["secret"].encode()).hexdigest()
if expected_hash == provided_hash:
if required_permission in info["permissions"]:
return True, f"授权成功:{name}"
return False, "无权限"
return False, "身份无效"
安全性分析
优点
- 摘要算法不可逆,隐藏调用方标识
- 实现简单,性能开销低
- 版本号可扩展
风险
- 容易遭受重放攻击
- 不涵盖请求完整性
- 密钥弱或泄露风险
后续改进
- 引入时间戳 / nonce 防重放
- 采用 HMAC 或签名算法覆盖请求关键字段
- 引入 RBAC / ABAC 提升权限管理
- 区分公开ID与私密密钥
- 定期轮换密钥并全程使用 TLS
总结
该摘要认证方案以最小代价满足基础身份验证和授权需求,适用于对性能和集成成本敏感、受信环境相对可控的接口调用场景。如需更高安全性,可按需引入时间戳、HMAC、签名以及细粒度权限模型等防护措施。