Python实现PBKDF2密码哈希时key.decode()报解码错误如何解决
问题原因
你的Python代码存在三处问题,导致运行报错、且哈希结果和Go版本不一致:
- 迭代次数参数错误:Go代码中PBKDF2迭代次数设置为
10000,你的Python代码里误写为1000,核心参数不匹配结果必然不同 - 缺少必要导入:
pbkdf2_hmac是Python标准库hashlib提供的方法,代码中未导入该模块,实际运行会直接触发名称错误 - 输出逻辑完全错误:PBKDF2返回的是随机二进制字节流,本身不是UTF-8编码的文本,直接调用
.decode()默认按UTF-8解析,遇到非法编码字节就会抛出你看到的UnicodeDecodeError。Go代码里是调用hex.EncodeToString把二进制结果转成十六进制可打印字符串输出,你的Python代码没有做这层转换,逻辑和Go端不对齐。
修正代码
把参数对齐、导入补全、输出逻辑改成和Go一致的十六进制编码即可,修正后完整代码如下:
import hashlib def main(): password = b'test' salt = b'Gare5vgHIo' iterations = 10000 key_len = 50 # 所有参数和Go端逻辑完全对齐 key = hashlib.pbkdf2_hmac( hash_name="sha256", password=password, salt=salt, iterations=iterations, dklen=key_len ) # 对应Go的hex.EncodeToString,将二进制字节转十六进制字符串输出 print(key.hex()) if __name__ == "__main__": main()
运行上述代码,输出的十六进制哈希字符串和Go代码运行结果完全一致。
内容的提问来源于stack exchange,提问作者R. Bogaveev
相关产品推荐
相关产品推荐

