Python加密Node.js解密时base64解码长度不一致问题求助
问题根因与解决方案
核心原因
你观察到的长度不一致并非字符串转义导致,本质是两类完全不同的长度指标对比逻辑错误+编码规则问题:
- Node.js 调用
Buffer.toString()时默认采用UTF-8编码,而你解码得到的是加密后的二进制字节流,本身包含大量不符合UTF-8编码规则的无效字节,这些字节会被默认替换为特殊占位符或者直接丢弃,最终得到的字符串长度自然会短于原始字节长度 - 你Python侧打印的是字节长度,Node.js侧打印的是UTF-8解码后的字符数量,两个指标本身维度不同,没有可比性,Node.js侧直接取
Buffer.length就能得到和Python一致的145结果。
解决方案
根据你的使用场景选择对应方案即可:
- 如果仅需要两边拿到完全一致的字节序列做解密,不要把二进制Buffer转成普通字符串,直接操作Buffer本身即可,无需额外编码转换
- 如果必须通过字符串格式传递加密结果,不要用默认UTF-8编码转换二进制,改用通用二进制字符串编码规则:
- 采用Base64编码:直接传递你现有变量
a的Base64字符串即可,两边base64解码后的字节完全一致 - 采用Hex编码:Node.js侧用
lenSize.toString('hex')转十六进制字符串,Python侧用lenSize.hex()转十六进制字符串,两边输出的字符串完全匹配
- 采用Base64编码:直接传递你现有变量
修正后Node.js测试代码
var a = 'b22KTGxtQmtRei9CTEtUKy0OY1qefbey0brGbNYaskVbrdclYyXFlkqSnolziVDMEguUB5Xx7+9vix8UpwUn8uAbQvmW/uVRM7gRAO063i4tpPD2Ao3wrgapLQQBYnUo+aB2uS5t3a4jzldKq8OUVsY9QWXRJ28vTvJuOnyR6+bpN9yDaiMHP0rdI510PRetIw==' var lenSize = Buffer.from(a, 'base64') // 取Buffer字节长度,和Python输出一致 console.log(lenSize.length) // 输出145 // 转Hex字符串可和Python侧直接对比 console.log(lenSize.toString('hex'))
修正后Python测试代码
import base64 a = 'b22KTGxtQmtRei9CTEtUKy0OY1qefbey0brGbNYaskVbrdclYyXFlkqSnolziVDMEguUB5Xx7+9vix8UpwUn8uAbQvmW/uVRM7gRAO063i4tpPD2Ao3wrgapLQQBYnUo+aB2uS5t3a4jzldKq8OUVsY9QWXRJ28vTvJuOnyR6+bpN9yDaiMHP0rdI510PRetIw==' lenSize = base64.b64decode(a) print(len(lenSize)) # 输出145 # 转Hex字符串可和Node.js侧直接对比 print(lenSize.hex())
内容的提问来源于stack exchange,提问作者Hitesh Panjawani
相关产品推荐
相关产品推荐

