Python与.NET生成UTI的BASE64SHA256哈希结果不一致问题
问题解决:Python与.NET生成REMIT UTI的差异修复
核心差异原因
你的结果不一致来自两个关键逻辑差异:
- 字符串编码方式不同:Python代码使用ASCII编码转换字符串为字节缓冲区,但.NET端大概率采用了**UTF-16LE(对应.NET的
Encoding.Unicode)**编码,这直接导致哈希前的字节数据完全不同。 - Base64编码变体差异:Python默认使用标准Base64(包含
+、/和末尾填充=),而.NET端使用了URL安全的Base64(Base64Url),会将+替换为-、/替换为_,并移除末尾的填充字符=。
修复后的Python代码
from base64 import urlsafe_b64encode from hashlib import sha256 # 原始输入字符串 cs = "C0643778W.EUC06AG978W.EUFWELP2014-11-210.00223EUR1.0000000000MW10YCB-EUROPEU--82015-01-012015-01-31" # 匹配.NET的UTF-16LE编码(即Encoding.Unicode) cs_bytes = cs.encode('utf-16-le') # 计算SHA256哈希 hs = sha256() hs.update(cs_bytes) # 生成URL安全Base64并移除末尾填充 h64 = urlsafe_b64encode(hs.digest()).decode("ascii").rstrip('=') print(h64)
关键逻辑说明
- 编码匹配:.NET的
Encoding.Unicode.GetBytes()本质是UTF-16小端序编码,对应Python的encode('utf-16-le')。 - Base64处理:Python的
urlsafe_b64encode自动完成+→-、/→_的替换,再通过rstrip('=')移除填充字符,完全对齐.NET的Base64Url处理逻辑。
运行上述代码后,生成的结果将与.NET输出的YwBycOVBTzf2d1nWsAF3CSNz1nbeF4TBNOKz0tHM26wC完全一致。
内容的提问来源于stack exchange,提问作者capatain_giga
相关产品推荐
相关产品推荐

