学习目标
读完这一讲,你能:
- 理解 API 签名的技术原理
- 识别签名破解在法律上的定性
- 建立一个 API 安全评估框架
技术原理
现代 APP 和网站为了保护 API,通常会在请求中加入签名参数。服务器校验签名,签名不对就拒绝请求。
典型的签名算法:
import hashlib
import time
import hmac
def sign_request(params, secret_key, timestamp=None):
"""
标准 API 签名算法
1. 按参数名排序
2. 拼接成字符串
3. 加上时间戳和密钥
4. HMAC-SHA256 计算签名
"""
if timestamp is None:
timestamp = str(int(time.time()))
# 参数按 key 排序
sorted_params = sorted(params.items())
param_str = '&'.join(f"{k}={v}" for k, v in sorted_params)
# 拼接签名原文
sign_content = f"{param_str}×tamp={timestamp}"
# HMAC-SHA256 签名
signature = hmac.new(
secret_key.encode(),
sign_content.encode(),
hashlib.sha256
).hexdigest()
return {
'timestamp': timestamp,
'signature': signature,
**params
}
# 使用示例
signed = sign_request(
{'page': 1, 'category': 'tech'},
secret_key='your_secret_key_here'
)
print(signed)
请求时带上签名:
headers = {'Content-Type': 'application/json'}
resp = requests.get(
'https://api.example.com/data',
params=signed,
headers=headers
)
逆向工程的完整流程
当签名算法不公开时,破解者需要:
- 抓包分析:用 Charles/Fiddler/Wireshark 抓取 APP 的请求,观察签名参数
- 定位签名函数:在 APP 安装包里找到计算签名的代码(Android 的 so 文件、iOS 的二进制)
- 逆向还原:用 IDA Pro / Ghidra / Frida 动态调试,还原算法逻辑
- 代码复现:在自己的爬虫里复现签名计算
# 伪代码:逆向还原后的签名算法(以 X-Gorgon 为例)
class XGorgonSigner:
"""
⚠ 法律风险提示:以下代码仅用于理解原理
实际用于破解商业平台签名可能构成犯罪
"""
def __init__(self, secret_key):
self.secret = secret_key
def calculate(self, request_body, timestamp):
"""模拟 X-Gorgon 签名计算"""
# 实际算法比这复杂得多,包含多层混淆和加密
base = hashlib.md5(request_body.encode()).hexdigest()
mixed = f"{base}{timestamp}{self.secret}"
return hashlib.sha256(mixed.encode()).hexdigest()[:32]
博主作为架构师律师带各位老同行从真实案例中学习技术的边界。
真实判例
丁某"客多多"案
鉴定意见的关键描述:
"送检的'采集端1.5.vmp.exe'程序在实现获取短视频平台当前热门话题功能的过程中,先发送验证请求至特定IP地址的服务器中'天盾服务端'程序进行验证,之后发送POST请求至特定网址获取X-Gorgon值,最后根据X-Gorgon、X-Khronos等参数值发送GET请求获取短视频平台服务器中上述数据。"
法院认定:这是"具有避开或者突破网络平台等计算机信息系统安全保护措施,使他人非法获取访问受限的数据的功能"。
注意措辞:"安全保护措施"。API 签名在法院眼里,不是"业务逻辑校验",是"安全保护措施"。破解它 = 突破安全保护措施 = 侵入。
王某"得物爬虫"案
上海普陀区人民法院认定:爬虫程序"通过破解API加密算法、批量获取设备身份指纹SK等技术方法绕过防护机制"。
两个核心技术点都被认定为"侵入":
- 破解 API 加密算法
- 获取设备身份指纹 SK
法律分析
API 签名破解的法律定性,目前司法实践中的趋势很明确:算侵入。
辩护空间在哪里?我认为有两个方向:
方向一:质疑"安全保护措施"的认定
不是所有自称"签名"的东西,都配叫"安全保护措施"。有些网站的 API 签名就是一个简单的 MD5(timestamp + secret),secret 硬编码在 JavaScript 里,任何人打开浏览器控制台就能拿到。这种措施在技术上形同虚设,能不能算刑法意义上的"安全保护措施",值得争论。
但趋势是法院采信标准越来越低。只要目标网站"采取了措施",不管多弱,绕过它就可能被认定。
方向二:功能单一性抗辩
如果你的爬虫软件除了破解签名之外,还有其他独立的、合法的功能,可以主张它不是"专门用于侵入"的程序。但这个辩点在专门的爬虫工具案里很难成立——如果软件的核心价值就是绕过签名抓数据,法院不会因为你加了一个"数据分析"按钮就改变定性。
实战输出:API 安全评估框架
"""
API 安全评估框架
评估目标 API 的保护强度,输出对应的法律风险等级
"""
class APISecurityAssessor:
def __init__(self, api_endpoint):
self.api = api_endpoint
self.score = 0
self.issues = []
def check_signature_complexity(self, signature_method):
"""评估签名算法复杂度"""
if signature_method in ('none', 'plain_md5'):
self.score += 10
self.issues.append("签名算法过于简单,法律风险低")
elif signature_method in ('hmac_sha256', 'rsa'):
self.score += 50
self.issues.append("签名算法强度中等")
elif 'custom_obfuscation' in signature_method:
self.score += 80
self.issues.append("自定义混淆算法,法院倾向认定为安全措施")
def check_device_binding(self, has_device_fingerprint):
"""评估设备绑定强度"""
if has_device_fingerprint:
self.score += 30
self.issues.append("设备指纹绑定:突破后法律风险高")
def check_rate_limiting(self, rate_limit_type):
"""评估限流措施"""
if rate_limit_type == 'ip_based':
self.score += 20
elif rate_limit_type == 'device_based':
self.score += 40
elif rate_limit_type == 'user_based':
self.score += 50
def assess(self):
"""综合评估"""
print(f"\n=== API 安全评估: {self.api} ===")
for issue in self.issues:
print(f" • {issue}")
print(f"\n安全强度得分: {self.score}/200")
if self.score < 50:
print("保护等级: 🟢 弱保护 - 法院可能不认定为安全措施")
elif self.score < 100:
print("保护等级: 🟡 中等保护 - 有一定辩护空间")
else:
print("保护等级: 🔴 强保护 - 突破后高概率认定为侵入")
return self.score
# 使用示例
assessor = APISecurityAssessor('https://api.example.com/data')
assessor.check_signature_complexity('custom_obfuscation_v2')
assessor.check_device_binding(has_device_fingerprint=True)
assessor.check_rate_limiting('device_based')
assessor.assess()
这个框架的法律价值:帮你在写爬虫之前,预判目标 API 的"法律保护强度"。得分越高的 API,你越不应该碰。