gpt4 book ai didi

python - 在 Python 中使用 openssl 时遇到问题

转载 作者:太空宇宙 更新时间:2023-11-03 17:30:05 24 4
gpt4 key购买 nike

对于初学者来说,我不能使用任何第三方模块,并且我的代码必须使用 Python 2.4,因为这是一个大型企业环境,并且该工具必须在没有第三方模块的情况下运行 vanilla 2.4 python 安装。

我正在为 openssl 编写一个包装器,它将用于检索/存储加密数据,主要是用户名/密码和其他身份验证类型数据。

我正在编写创建模块,该模块创建一个新的、空的加密pickle 文件。

流程如下:

在内存中创建一个 picklelized 对象,它基本上是一个字典对象。 (pickle.dumps)加密内存中生成的pickle字符串(echo string | openssl.....)将这个新字符串写为 pickle 对象。 (pickle.dump)

这是我当前的尝试:

def create(self, wallet, cipher=None, passphrase=None, **kawrgs):

self.wallet = wallet
rawdata = None
encdata = None
outfile = None

try:
outfile = open(self.wallet, 'w')
except Exception, e:
raise OpenSSLWalletError("Failed to open '%s' for writing" % self.wallet, None, None, None)

if passphrase:
self.passphrase = "-k %s" % passphrase
else:
self.passphrase = "-k ''"

if cipher:
self.cipher = cipher

try:
rawdata = pickle.dumps(self.data)
cmd = "echo -en '%s' | %s %s -a -salt %s" % (rawdata, self.openssl, self.cipher, self.passphrase)
os_cmd = shlex.split(cmd)
proc = subprocess.Popen(os_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
encdata, stderr = proc.communicate()
pickle.dump(encdata, outfile)
except Exception, e:
raise OpenSSLWalletError("Failed to create encrypted wallet '%s'" % self.wallet, cmd.rstrip(), None, stderr.rstrip())

我相信我的问题与 pickle 在对象中间添加换行符有关,这会破坏 openssl 命令:

这是 pickle.dumps 之后字符串的样子(基本上这只是一个输入到 pickle 的空字典):

self.data='{}'
'(dp0
.'

如果我在将 cmd 发送到 Popen 之前将其打印出来,它看起来像这样:

cmd='echo(dp0

。 |/usr/bin/openssl aes-256-cbc -a -salt -k '''

我尝试过转义字符串、shell=True、shell=False 等...

有人知道我可以解决这个问题的任何技巧或方法吗?我假设从 pickle 对象中删除换行符将破坏 pickle 格式并且它将无法加载,对吗?

感谢您的帮助。

最佳答案

rawdata可以包含任意二进制数据,我更喜欢非 shell 模式并将数据直接传递到 openssl的标准输入通过Popen.communicate() 。问题是您还必须向 Popen 表明stdin 应该通过管道传输的构造函数。

rawdata = pickle.dumps(self.data)
cmd = [self.openssl, cipher, "-a", "-salt", "-k", passphrase or "''"]
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
encdata, stderr = proc.communicate(input=rawdata)

另请注意 encdata将以换行符结束。

关于python - 在 Python 中使用 openssl 时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31993238/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com