在 Python 中使用 openssl 时遇到问题
Trouble working with openssl within Python
对于初学者来说,我不能使用任何第 3 方模块,我的代码必须使用 Python 2.4,因为这是一个大型企业环境,这个工具必须在 vanilla 2.4 python 上使用安装时没有第三方模块。
我正在为 openssl 编写一个包装器,它将用于 retrieve/store 加密数据,主要是 usernames/passwords 和其他身份验证类型的数据。
我正在编写创建模块,它创建一个新的、空的加密 pickle 文件。
流程如下:
在内存中创建一个腌制对象,它基本上是一个字典对象。 (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
.'
如果我在将命令输入 Popen 之前打印出 cmd,它看起来像这样:
cmd='echo (dp0
。 | /usr/bin/openssl aes-256-cbc -a -salt -k '''
我试过转义字符串,shell=True,shell=False,等等....
有人知道我可以解决这个问题的任何技巧或方法吗?我假设从 pickle 对象中删除换行符会破坏 pickle 格式并且无法加载,对吗?
感谢您的帮助。
由于 rawdata
可以包含任意二进制数据,我更喜欢非 shell 模式并通过 Popen.communicate()
将数据直接传递到 openssl
的标准输入.要注意的是,您还必须向 Popen
构造函数指示应该通过管道传输标准输入。
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
将以换行符结尾。
对于初学者来说,我不能使用任何第 3 方模块,我的代码必须使用 Python 2.4,因为这是一个大型企业环境,这个工具必须在 vanilla 2.4 python 上使用安装时没有第三方模块。
我正在为 openssl 编写一个包装器,它将用于 retrieve/store 加密数据,主要是 usernames/passwords 和其他身份验证类型的数据。
我正在编写创建模块,它创建一个新的、空的加密 pickle 文件。
流程如下:
在内存中创建一个腌制对象,它基本上是一个字典对象。 (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
.'
如果我在将命令输入 Popen 之前打印出 cmd,它看起来像这样:
cmd='echo (dp0
。 | /usr/bin/openssl aes-256-cbc -a -salt -k '''
我试过转义字符串,shell=True,shell=False,等等....
有人知道我可以解决这个问题的任何技巧或方法吗?我假设从 pickle 对象中删除换行符会破坏 pickle 格式并且无法加载,对吗?
感谢您的帮助。
由于 rawdata
可以包含任意二进制数据,我更喜欢非 shell 模式并通过 Popen.communicate()
将数据直接传递到 openssl
的标准输入.要注意的是,您还必须向 Popen
构造函数指示应该通过管道传输标准输入。
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
将以换行符结尾。