Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在没有子流程的情况下导入和使用系统gpg密钥_Python_Gnupg - Fatal编程技术网

Python 如何在没有子流程的情况下导入和使用系统gpg密钥

Python 如何在没有子流程的情况下导入和使用系统gpg密钥,python,gnupg,Python,Gnupg,我决定回顾一下我的一个脚本是如何提取gpg密钥并用该密钥加密密码的。目前,我正在使用subprocess在主机上运行命令,如下所示: def check_查找导入的_gpg_密钥() gpg_keys=子进程。检查_输出([“gpg”,“-k”])。解码(“utf-8”) 如果gpg_键中有“支柱”: 返回真值 其他: 返回错误 def加密柱密码(密码): hashed_pass=crypt.crypt(str(密码)) key\u imported=检查\u导入的\u gpg\u key()

我决定回顾一下我的一个脚本是如何提取gpg密钥并用该密钥加密密码的。目前,我正在使用subprocess在主机上运行命令,如下所示:

def check_查找导入的_gpg_密钥()
gpg_keys=子进程。检查_输出([“gpg”,“-k”])。解码(“utf-8”)
如果gpg_键中有“支柱”:
返回真值
其他:
返回错误
def加密柱密码(密码):
hashed_pass=crypt.crypt(str(密码))
key\u imported=检查\u导入的\u gpg\u key()
如果导入的密钥为False:
打印(“OI!导入密钥bud!”)
打印(“使用发布密钥加密密码”)
进程=子进程.Popen(
(
“gpg”,
“--盔甲”,
“--批处理”,
“--信任模型”,
“永远”,
“--加密”,
“-r”,
“支柱”,
),
stdout=子流程.PIPE,
stdin=子流程.PIPE,
stderr=子流程.PIPE,
)
gpg_message=process.communicate(输入=hashed_pass.encode())[0]
如果str中的“开始PGP消息”(gpg_消息):
返回gpg_消息
其他:
打印(“生成加密哈希时出错”)
打印(str(gpg_消息))
一无所获

有没有一种更好、更像蟒蛇的方式来完成这项任务?我目前还不知道有任何其他方法可以做到这一点。

到目前为止,除了对消息手动应用加密原语(不推荐),生成子进程是在python中访问gnupg的最佳方法。有一个第三方模块名为
python gnupg
,但它主要是gpg二进制文件的包装器。

这也是我所发现的,我相信该库将帮助我的代码看起来更像python,但当我做与库基本相同的事情时,它不会以任何方式提高安全性。如果您的目的是安全性,特别是gpg和PythonGnuPG都是为这项工作选择的工具(我作为PythonGnuPG的贡献者这样说)。Go
x/crypto/openpgp
库是一个更好的实现,它完全是日以继夜。我不再将Python用于需要解析或生成OpenPGP消息的代码,也不建议其他人这样做……如果您通读Python gnupg代码,您将看到它试图适应后端不同版本的gpg所预期/正常/预期的不同事件消息流——理解到忽略一条无法识别的消息是不安全的,因为该消息可能意味着一些关键的东西(f/e,我们在刚刚发出输出的输入文件末尾没有找到完整性数据包)。