【发布时间】:2018-03-22 03:55:36
【问题描述】:
我需要编写一个自动化任务来使用 python gnupg lib pgp 加密文件。
我将从安全云获取加密密钥,出于安全原因,我不喜欢将密钥存储在本地磁盘中。
我知道您可以指定主目录,也可以导入密钥,但我想知道是否可以不指定主目录,以及我们是否可以避免不将密钥保存到文件中。
我对任何可以完成此 pgp 加密的 python 库都是开放的。
【问题讨论】:
标签: python python-3.x gnupg
我需要编写一个自动化任务来使用 python gnupg lib pgp 加密文件。
我将从安全云获取加密密钥,出于安全原因,我不喜欢将密钥存储在本地磁盘中。
我知道您可以指定主目录,也可以导入密钥,但我想知道是否可以不指定主目录,以及我们是否可以避免不将密钥保存到文件中。
我对任何可以完成此 pgp 加密的 python 库都是开放的。
【问题讨论】:
标签: python python-3.x gnupg
要加密数据,您只需要公钥,因此将其存储在自动化系统上不会存在固有的安全问题。由于您对关注哪种类型的安全问题并不太具体,我将不得不假设您的意思是您不想永久存储识别数据所在的密钥或密钥所有者的信息实际上是加密的。
如果您没有通过使用任何库的任何标准方法指定主目录,则 GPG 将默认为调用脚本的用户的主目录(默认为$HOME/.gnupg)。此外,要加密为公钥,它必须在实际使用时在磁盘上可用。不过,如果你愿意,你可以在之后直接摆脱它。
要在 /tmp 目录中创建一个临时主目录(不推荐,但在 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 保护文件,那么这会将其导入新的临时主目录:
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 中提供了有关此模块如何(以及为什么)执行其功能的更多详细信息。
【讨论】: