You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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()复制一份再操作,避免影响其他逻辑
  • 数字参数要转字符串:比如idauth_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)贴出来,我再帮你细查~

火山引擎 最新活动