文章 · 2022-01-05

基于摘要认证的第三方接口调用方案

{
    "credential": "key:46d47e6c6d8e0c826e214447f80627b6e527c0bfa52323332adb6479c639b5ee=version:v1",
    "page_size": 10,
    "page": 1
}

上述请求体中的 credential 字段即为摘要凭证。其格式为 key:<hash>=version:v1,其中 key: 后的十六进制字符串是通过 SHA-256 算法计算的 client_id 摘要值,version:v1 表示认证方案版本。版本号指导服务器选择对应的验证算法。

这一设计是轻量级的:确认身份仅需一次摘要计算和比对。平台可在数据库中直接添加新的第三方或修改其权限配置,无需重新部署代码。

认证字段生成方法

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, "身份无效"

安全性分析

后续改进

总结

该摘要认证方案以最小代价满足基础身份验证和授权需求,适用于对性能和集成成本敏感、受信环境相对可控的接口调用场景。如需更高安全性,可按需引入时间戳、HMAC、签名以及细粒度权限模型等防护措施。

© 2026 Yuxu Ge ·