我有一个python应用程序,它创建一个子进程,打开一个套接字与之通信,然后在套接字上创建一个multiprocessing.connection对象。连接对象使用共享密钥(随机生成)和hmac,以确保不允许其他进程通过连接进行通信。
在Linux上,这非常有效。在Windows上,我收到错误:
multiprocessing.AuthenticationError: digest received was wrong
密钥是一串随机生成的位,在被stdin发送到子进程之前被腌制:
authkey = ''.join([chr(random.getrandbits(7)) for i in range(20)])
我已经仔细检查了连接两端的密钥匹配:
print "key:", ' '.join([str(ord(x)) for x in authkey])
服务器以:
启动 l = multiprocessing.connection.Listener(
('localhost', int(port)), authkey=authkey)
..客户端以:
开头 c = multiprocessing.connection.Client(
('localhost', int(port)), authkey=authkey)
两个进程都在同一台机器上运行,使用相同版本的python。
更奇怪的是,我发现如果我修复了密钥(例如,authkey ='test'),那么我第一次运行程序时仍然会收到AuthenticationError,但后续运行时却没有。
答案 0 :(得分:0)
解决方案似乎是使用os.urandom
生成密钥而不是上面显示的方法。我不知道为什么会产生任何影响 - 在任何一种情况下我们都会传递随机字节字符串。从安全角度来看,解决方案也更加正确,因为getrandbits不适合加密使用。