Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何正确保护pickle文件?_Python_Python 3.x_Encoding_Pickle_Hmac - Fatal编程技术网

Python 如何正确保护pickle文件?

Python 如何正确保护pickle文件?,python,python-3.x,encoding,pickle,hmac,Python,Python 3.x,Encoding,Pickle,Hmac,我遵循这一点来正确保护pickle文件,但是我没有得到相同的输出。允许我在第一次运行时做一些更改: 导入hashlib 进口hmac 进口泡菜 类虚拟: 通过 obj=虚拟() 数据=pickle.dumps(obj) digest=hmac.new(b'unique-key-here',data,hashlib.blake2b).hexdigest() 以open('temp.txt','wb')作为输出: 输出.写入(str(摘要)+''+数据) 将open('temp.txt','r')作

我遵循这一点来正确保护pickle文件,但是我没有得到相同的输出。允许我在第一次运行时做一些更改:

导入hashlib
进口hmac
进口泡菜
类虚拟:
通过
obj=虚拟()
数据=pickle.dumps(obj)
digest=hmac.new(b'unique-key-here',data,hashlib.blake2b).hexdigest()
以open('temp.txt','wb')作为输出:
输出.写入(str(摘要)+''+数据)
将open('temp.txt','r')作为f:
data=f.read()
摘要,数据=数据。拆分(“”)
预期的_digest=hmac.new(b'unique-key-here',数据,hashlib.blake2b).hexdigest()
如果不是秘密。比较\u摘要(摘要,预期的\u摘要):
打印('无效签名')
出口(1)
obj=pickle.load(数据)
运行此命令时,我会得到以下堆栈跟踪:

文件“test.py”,第21行,在
预期的_digest=hmac.new(b'unique-key-here',数据,hashlib.blake2b).hexdigest()
文件“/usr/lib/python3.8/hmac.py”,第153行,新格式
返回HMAC(键、消息、digestmod)
文件“/usr/lib/python3.8/hmac.py”,第88行,在__
自我更新(msg)
文件“/usr/lib/python3.8/hmac.py”,第96行,在更新中
self.internal.update(msg)
TypeError:在散列之前必须对Unicode对象进行编码

您的问题是
data=f.read()
.read()
返回一个字符串和
hmac.new()
需要
字节。将问题行更改为
data=f.read().encode('utf-8')
或以二进制模式读取文件(
'b'
标志)

参考资料:


您的问题是
data=f.read()
.read()
返回一个字符串和
hmac.new()
需要
字节。将问题行更改为
data=f.read().encode('utf-8')
或以二进制模式读取文件(
'b'
标志)

参考资料:


我最后不得不使用以下方法使其工作:

pickle.load(编解码器.decode(pickle\u data.encode(),'base64'))
#及
codecs.encode(pickle.dumps(pickle_obj),“base64”).decode()

不确定为什么使用
.encode()
.decode()
对我仍然不起作用。

我最后不得不使用以下方法才能工作:

pickle.load(编解码器.decode(pickle\u data.encode(),'base64'))
#及
codecs.encode(pickle.dumps(pickle_obj),“base64”).decode()

不知道为什么使用
.encode()
.decode()
对我仍然不起作用。

这几乎对我起作用了。出于某种奇怪的原因,我不得不导入编解码器文件并以这种方式进行转换,而不是仅仅使用
.encode()
。这对我来说毫无意义,因为这几乎对我有用。出于某种奇怪的原因,我不得不导入编解码器文件并以这种方式进行转换,而不是仅仅使用
.encode()
。这对我来说毫无意义