繁体   English   中英

在Python中使用openssl遇到麻烦

[英]Trouble working with openssl within Python

首先,我不能使用任何第三方模块,并且由于这是一个大型企业环境,因此我的代码必须与Python 2.4配合使用,并且该工具必须在没有第三方模块的原始2.4 python安装环境下使用。

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

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

流程如下:

在内存中创建一个腌制对象,基本上是一个字典对象。 (pickle.dumps)将所得的腌制字符串加密在内存中(回显字符串| openssl .....)将新的字符串写为腌制对象。 (和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())

我相信我的问题与泡菜在对象中间添加换行符有关,这然后打破了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模式,并通过Popen.communicate()将数据直接传递到openssl的标准输入中。 要注意的是,您还必须向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将以换行符结尾。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM