PythonGnuPG如何对文件进行pgp加密,而不必指定homedir或将密钥存储在目录中

PythonGnuPG如何对文件进行pgp加密,而不必指定homedir或将密钥存储在目录中,python,python-3.x,gnupg,Python,Python 3.x,Gnupg,我需要编写一个自动化任务来使用python gnupg lib对文件进行pgp加密 我将从安全云获取加密密钥,出于安全原因,我不希望将密钥存储在本地磁盘中 我知道您可以指定homedir,也可以导入密钥,但我想知道是否可以不指定homedir,以及是否可以避免不将密钥保存到文件中 我对任何可以完成pgp加密的python库都持开放态度 要加密数据,您只需要公钥,因此将其存储在自动化系统上不会存在固有的安全问题。由于您没有太具体地说明所关注的安全问题的类型,因此我不得不假设您的意思是,您不希望永久

我需要编写一个自动化任务来使用python gnupg lib对文件进行pgp加密

我将从安全云获取加密密钥,出于安全原因,我不希望将密钥存储在本地磁盘中

我知道您可以指定homedir,也可以导入密钥,但我想知道是否可以不指定homedir,以及是否可以避免不将密钥保存到文件中


我对任何可以完成pgp加密的python库都持开放态度

要加密数据,您只需要公钥,因此将其存储在自动化系统上不会存在固有的安全问题。由于您没有太具体地说明所关注的安全问题的类型,因此我不得不假设您的意思是,您不希望永久存储标识密钥或密钥所有者的信息,该密钥或密钥所有者实际上是加密数据的对象

如果未通过使用的任何库的任何标准方法指定homedir,则GPG将默认为调用脚本的用户的homedir(默认情况下,这将是
$HOME/.gnupg
)。此外,要加密到公钥,它必须在实际使用时在磁盘上可用。不过,如果你愿意的话,你可以在事后马上把它处理掉

要在
/tmp
目录中创建要使用的临时homedir(不推荐,但在某些系统(如Linux)上可能有用),请执行以下操作:

import os
import os.path

newhome = "/tmp/.gnupg"

if os.path.exists(newhome) is True:
    print("The {0} directory already exists.".format(newhome))
else:
    print("Creating the {0} directory.".format(newhome))
    os.mkdir(newhome)
    os.chmod(newhome, 0o700)
本示例的其余部分使用GPGME Python绑定

假设您已将公钥作为本地ASCII铠装文件下载,则这会将其导入新的临时homedir:

import gpg

keyfile = "/tmp/key.asc"
c = gpg.Context(armor=True, home_dir=newhome)
with open(keyfile, "rb") as f:
    keydata = f.read()

c.op_import(keydata)
result = c.op_import_result()
既然你知道你得到的是哪把钥匙,我假设你也知道它是钥匙ID或指纹,那么我们就直接来看看这个:

key_id = "0x12345678DEADBEEF"
filename = "/path/to/secret_plans.txt"

rkey = list(gpg.Context().keylist(pattern=key_id, secret=False))
with open(filename, "rb") as f:
    text = f.read()

ciphertext, result, sign_result = c.encrypt(text, recipients=rkey, sign=False,
                                            always_trust=True)
with open("{0}.asc".format(filename), "wb") as fa:
    fa.write(ciphertext)
完成后,您可以按自己喜欢的方式删除
新家

有关此模块如何(以及为什么)执行其操作的更多详细信息,请参见(组织模式源文件)和