如何计算Forge of Empires HTTP请求的Signature签名?
Forge of Empires 请求Signature签名计算问题排查
可能的问题点及解决方案
1. Secret处理方式错误
你当前直接使用Base64编码的Secret字符串拼接,但签名计算通常需要解码后的原始字节密钥,而非Base64字符串本身。尝试先将Secret解码为字节再参与计算:
import base64 # 解码Base64格式的secret secret_bytes = base64.b64decode(secret)
2. JSON序列化细节不匹配
Forge of Empires后端对JSON payload的序列化格式有严格要求,需确保你的生成结果和真实请求完全一致:
- 键顺序:虽然你用了
OrderedDict,但要确认是否和后端预期的键顺序完全对齐(比如原始JSON中的__class__、requestData等顺序不能错)。 - 空格与分隔符:你的代码用
separators=(',', ':')生成无空格JSON,但如果后端实际接收的是带缩进的JSON,会导致拼接内容不一致。建议抓包获取真实请求的JSON字符串,和你生成的encoded变量对比。
3. 拼接顺序错误
当前拼接顺序是user_key + secret + encoded,但部分场景下签名的拼接顺序可能不同,比如:
secret + user_key + encodedencoded + user_key + secret
建议尝试调整拼接顺序,验证是否匹配预期签名。
4. User Key未正确填充
代码中user_key = 是空值,需填入正确的User Key,且该值必须与请求中User-Key请求头的内容完全一致(注意大小写、特殊字符)。
5. 编码格式问题
默认data.encode()使用UTF-8编码,若后端使用其他编码(如latin-1),会导致哈希结果不一致。可尝试指定编码:
data_bytes = user_key.encode('latin-1') + secret_bytes + encoded.encode('latin-1')
修改后的示例代码
以下是包含Secret解码、严格JSON序列化的验证代码:
import json import hashlib import base64 from collections import OrderedDict user_key = "你的实际User Key" # 替换为真实User Key secret = "6q01Zd9YKTSEVjhtqqGEYjBGr3pUTRFojYL+m2/6GorQ892bVcY4QMoqLbc6A+DhXQEaMtZfkczMgiHt3tVJ4w==" secret_bytes = base64.b64decode(secret) # 严格按照原始JSON的键顺序构建payload payload = [OrderedDict([ ("__class__", "ServerRequest"), ("requestData", [[24997]]), ("requestClass", "CityProductionService"), ("requestMethod", "pickupProduction"), ("requestId", 91) ])] # 序列化时确保和后端一致,先尝试无空格格式 encoded = json.dumps(payload, separators=(',', ':'), ensure_ascii=False) # 拼接:user_key字节 + 解码后的secret字节 + 序列化JSON字节 data = user_key.encode('utf-8') + secret_bytes + encoded.encode('utf-8') signature = hashlib.md5(data).hexdigest()[:10] print("Signature:", signature)
额外验证步骤
- 抓包获取真实请求的
User-Key、Signature以及请求体,对比你生成的拼接内容和后端使用的是否完全一致。 - 确认MD5计算后的十六进制字符串前10位是否正确截取(注意大小写,通常后端会忽略大小写,但最好保持一致)。
内容的提问来源于stack exchange,提问作者Adam Adam
相关产品推荐
相关产品推荐

