python gnupg 如何在不指定 homedir 或在目录中存储密钥的情况下对文件进行 pgp 加密
python gnupg how to pgp encrypt a file without having to specify a homedir, or store key in the directory
我需要编写一个自动化任务来使用 python gnupg 库来 pgp 加密文件。
我将从安全云中获取加密密钥,出于安全原因,我倾向于不将密钥存储在本地磁盘中。
我知道您可以指定主目录,也可以导入密钥,但我想知道是否可以不指定主目录,以及我们是否可以避免不将密钥保存到文件中。
我愿意接受任何可以完成此 pgp 加密的 python 库。
要加密数据,您只需要 public 密钥,因此将其存储在自动化系统中不存在固有的安全问题。由于您对所关注的安全问题类型不太具体,我将不得不假设您的意思是您不想永久存储标识密钥或密钥所有者的信息实际上是加密的。
如果您没有通过使用任何库的任何标准方法指定主目录,则 GPG 将默认为调用脚本的用户的主目录(默认情况下为 $HOME/.gnupg
)。此外,要加密为 public 密钥,它必须在实际使用时在磁盘上可用。不过,如果你愿意,你可以在之后直接删除它。
要在 /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 绑定。
假设您已经将 public 密钥下载为本地 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 (Org Mode source file) and a HTML version is here.
中提供了有关此模块如何(以及为什么)执行其操作的更多详细信息
我需要编写一个自动化任务来使用 python gnupg 库来 pgp 加密文件。
我将从安全云中获取加密密钥,出于安全原因,我倾向于不将密钥存储在本地磁盘中。
我知道您可以指定主目录,也可以导入密钥,但我想知道是否可以不指定主目录,以及我们是否可以避免不将密钥保存到文件中。
我愿意接受任何可以完成此 pgp 加密的 python 库。
要加密数据,您只需要 public 密钥,因此将其存储在自动化系统中不存在固有的安全问题。由于您对所关注的安全问题类型不太具体,我将不得不假设您的意思是您不想永久存储标识密钥或密钥所有者的信息实际上是加密的。
如果您没有通过使用任何库的任何标准方法指定主目录,则 GPG 将默认为调用脚本的用户的主目录(默认情况下为 $HOME/.gnupg
)。此外,要加密为 public 密钥,它必须在实际使用时在磁盘上可用。不过,如果你愿意,你可以在之后直接删除它。
要在 /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 绑定。
假设您已经将 public 密钥下载为本地 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 (Org Mode source file) and a HTML version is here.
中提供了有关此模块如何(以及为什么)执行其操作的更多详细信息