python gnupg如何pgp加密文件而不必在目录中指定homedir或store key

时间:2018-03-22 03:55:36

标签: python python-3.x gnupg

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

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

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

我对任何可以完成此pgp加密的python库开放。

1 个答案:

答案 0 :(得分:2)

要加密数据,您只需要公钥,因此将其存储在自动系统上没有固有的安全问题。由于您不太关注何种类型的安全问题,我将不得不假设您不想永久存储标识密钥或密钥的信息实际加密数据的所有者。

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

要在/tmp目录中创建临时homedir(不推荐,但在Tails 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)

一旦完成,您可以按照自己喜欢的方式删除newhome

GPGME Python bindings HOWTO(组织模式源文件)和HTML version is here中提供了此模块执行操作的方式(以及原因)的详细信息。