我正在尝试通过 python 程序远程控制 gpg POpen
。
我有一个包含加密数据的文件,我想对其进行解密、修改并重新加密后写回磁盘。
目前我将解密的信息存储在一个临时文件中(我shred
在程序结束时)。然后我对该文件进行修改,然后使用一个函数重新加密它,该函数将密码短语通过stdin
.
代码如下:
def encrypt(source, dest, passphrase, cipher=None):
"""Encrypts the source file.
@param source Source file, that should be encrypted.
@param dest Destination file.
@param passphrase Passphrase to be used.
@param cipher Cipher to use. If None or empty string gpg's default cipher is
used.
"""
phraseecho = Popen(("echo", passphrase), stdout=subprocess.PIPE)
gpgargs = [
"gpg",
"-c",
"--passphrase-fd", "0", # read passphrase from stdin
"--output", dest,
"--batch",
"--force-mdc"]
if not cipher is None and len(cipher) > 0:
gpgargs.extend(("--cipher-algo", cipher))
gpgargs.append(source)
encrypter = Popen(
gpgargs,
stdin=phraseecho.stdout,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
stdout, stderr = encrypter.communicate()
rc = encrypter.returncode
if not rc == 0:
raise RuntimeError(
"Calling gpg failed with return code %d: %s" % (rc, stderr))
这工作得很好,但我相当确定将潜在敏感的解密数据存储在临时文件中是一个相当大的安全漏洞。
所以我想以某种方式重写我的加密/解密函数,使它们能够完全在内存中工作,而不会将敏感数据存储在磁盘上。
解密还可以通过管道传输密码短语stdin
并捕获stdout
解密数据来直接进行。
另一方面,加密让我发疯,因为我不能只将密码和消息传递给“stdin”……至少
encrypter.stdin.write("%s\n%s" % (passphrase, message))
没用。
我的下一个最佳猜测是提供某种内存文件/管道/套接字的文件描述符或其他任何--passphrase-fd
参数。问题是:我不知道是否存在诸如内存文件之类的东西,或者套接字是否适用,因为我从未使用过它们。
任何人都可以帮助或指出我的问题的更好解决方案吗?
该解决方案不必是可移植的 - 我完全可以使用仅 Linux 的方法。
提前致谢...
编辑:
非常感谢你们,Lars 和 ryran。两种解决方案都可以完美运行!可惜我只能接受一个