Python实现Telegram登录哈希生成函数无法匹配预期值的问题求助
Python实现Telegram登录哈希生成函数无法匹配预期值的问题求助
我最近在做Telegram登录的哈希验证,写了个生成函数但死活和预期值对不上,试了好几个StackOverflow的方案都没解决,实在头大,来请教各位大佬!
先贴我的代码:
import hashlib import hmac TELEGRAM_TOKEN = "你的Bot Token" # 替换成实际Bot Token def _generate_hash(data: dict) -> str: data.pop("hash") data_check_arr = [] for key, value in data.items(): data_check_arr.append(f"{key}={value}") data_check_arr.sort() data_check_string = "\n".join(data_check_arr) # 怀疑这行编码处理有问题! data_check_string=data_check_string.encode("utf-8").decode("unicode-escape").encode("ISO-8859-1") secret_key = hashlib.sha256(TELEGRAM_TOKEN.encode("utf-8")).digest() hash_value = hmac.new(secret_key, data_check_string, hashlib.sha256).hexdigest() return hash_value
测试结果:
- 预期值:
ab17c822b9a6c952d24ce687c2abf6d9bd69ef458d8c5744ff442d79bf918486 - 实际生成:
21d4d25316f6daa91993bde8e451d92ab75e13b547a955449fe05ac33b45f903
排查后发现的问题&修复方案
我仔细对照Telegram官方的哈希验证规则看了下,问题大概率出在多余的编码转义步骤上,另外还有两个细节容易踩坑:
1. 错误的编码处理
Telegram官方要求直接使用拼接后的字符串的UTF-8字节来计算哈希,不需要做unicode-escape解码再转ISO-8859-1编码的操作——这一步会篡改原始字符串的字节序列,导致和服务器计算的哈希完全不一致。
2. 容易忽略的细节
- 别直接修改原字典:用
copy()复制一份再操作,避免影响其他逻辑 - 数字参数要转字符串:比如
id、auth_date这类数字型参数,必须转成字符串再拼接,Telegram服务器是用字符串形式的参数值计算的
修改后的正确代码
import hashlib import hmac TELEGRAM_TOKEN = "你的Bot Token" def _generate_hash(data: dict) -> str: # 复制字典避免修改原数据 data_copy = data.copy() data_copy.pop("hash", None) data_check_arr = [] for key, value in data_copy.items(): # 数字类型参数强制转字符串 data_check_arr.append(f"{key}={str(value)}") data_check_arr.sort() data_check_string = "\n".join(data_check_arr) # 直接用UTF-8编码成字节 data_check_bytes = data_check_string.encode("utf-8") secret_key = hashlib.sha256(TELEGRAM_TOKEN.encode("utf-8")).digest() hash_value = hmac.new(secret_key, data_check_bytes, hashlib.sha256).hexdigest() return hash_value
你把实际的Bot Token和测试参数填进去试试,应该就能得到预期的哈希值了!如果还是不对,可以把完整的测试参数(除了Bot Token)贴出来,我再帮你细查~




