gpt4 book ai didi

python /POpen/gpg : Supply passphrase and encryption text both through stdin or file descriptor

转载 作者:太空狗 更新时间:2023-10-30 03:05:39 38 4
gpt4 key购买 nike

我正在尝试通过 POpen 的 python 程序远程控制 gpg。
我有一个包含加密数据的文件,我想对其进行解密、修改并重新加密后写回磁盘。
目前,我将解密后的信息存储在一个临时文件中(程序结束时我将其切碎)。然后我对该文件进行修改,然后使用函数重新加密它,该函数通过 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。两种解决方案都可以完美运行!可惜我只能接受一个

最佳答案

下面是我在 Obnam 中使用的代码运行 gpg,或许能对您有所帮助。

def _gpg_pipe(args, data, passphrase):
'''Pipe things through gpg.

With the right args, this can be either an encryption or a decryption
operation.

For safety, we give the passphrase to gpg via a file descriptor.
The argument list is modified to include the relevant options for that.

The data is fed to gpg via a temporary file, readable only by
the owner, to avoid congested pipes.

'''

# Open pipe for passphrase, and write it there. If passphrase is
# very long (more than 4 KiB by default), this might block. A better
# implementation would be to have a loop around select(2) to do pipe
# I/O when it can be done without blocking. Patches most welcome.

keypipe = os.pipe()
os.write(keypipe[1], passphrase + '\n')
os.close(keypipe[1])

# Actually run gpg.

argv = ['gpg', '--passphrase-fd', str(keypipe[0]), '-q', '--batch'] + args
tracing.trace('argv=%s', repr(argv))
p = subprocess.Popen(argv, stdin=subprocess.PIPE, stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
out, err = p.communicate(data)

os.close(keypipe[0])

# Return output data, or deal with errors.
if p.returncode: # pragma: no cover
raise obnamlib.Error(err)

return out


def encrypt_symmetric(cleartext, key):
'''Encrypt data with symmetric encryption.'''
return _gpg_pipe(['-c'], cleartext, key)


def decrypt_symmetric(encrypted, key):
'''Decrypt encrypted data with symmetric encryption.'''
return _gpg_pipe(['-d'], encrypted, key)

关于 python /POpen/gpg : Supply passphrase and encryption text both through stdin or file descriptor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11367140/

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