【问题标题】:How to pass encrypted message and passphrase when using `os.system` to call gpg?使用`os.system`调用gpg时如何传递加密消息和密码?
【发布时间】:2019-04-21 06:18:01
【问题描述】:

我在 python 中有一个加密消息作为字符串。我想用一个叫做 gpg 的程序来解密它。

在终端中,使用 gpg 需要:

  1. gpg --decrypt -a
  2. 然后它会提示您输入加密消息
  3. 然后提示输入私钥。

当加密的消息保存在 python 的变量中时,有没有办法在 python 中完成所有这些操作?我知道您使用 os 模块向其他程序发出终端命令。

import os
import getpass
message = '093j0rawrkj2or2r'
private_key = getpass.getpass()
os.system("gpg --decrypt -a")
...?

【问题讨论】:

    标签: python-3.x ubuntu encryption gnupg


    【解决方案1】:

    要输入加密字符串,您可以先将echo 输出,然后通过管道输入gpg 命令。

    echo <message> | gpg --decrypt ...
    

    要输入密码,有多种方法depending on your env and gpg version。在我的 Ubuntu 18.04.2 上使用 gpg 2.2.4 的方法是使用--pinentry-mode=loopback,然后传入--passphrase

    gpg --decrypt -a --pinentry-mode=loopback --passphrase="yourpassphrase" 
    

    Python 代码将如下所示:

    import os
    
    message = '093j0rawrkj2or2r'
    command = "echo '{}' | gpg --decrypt -a --pinentry-mode=loopback --passphrase=yourpassphrase".format(message)
    os.system(command)
    

    但是放置实际的--passphrase-yourpassphrase 是非常不安全的。另一种方法是将密码放在某个文件中,然后改用--passphrase-file 选项。

    import os
    
    message = '093j0rawrkj2or2r'
    command = "echo '{}' | gpg --decrypt -a --pinentry-mode=loopback --passphrase-file=yourpassphrasefile".format(message)
    os.system(command)
    

    我不知道您从哪里得到加密消息,但我通常使用加密的文件。如果加密输入来自文件,只需将echo &lt;string&gt; 替换为cat &lt;filepath&gt;

    cat somefile.txt | gpg --decrypt -a --pinentry-mode=loopback --passphrase-file=yourpassphrasefile
    

    【讨论】:

    • 这样放私钥密码有风险吗?还是以这种方式做事?
    • @Qwertford 好吧,我认为只要您将密码(硬编码字符串或密码文件)和私钥提交到任何存储库,或共享/分发它们公开的,应该没问题。它们应该只在您的机器上本地可用。如果您真的需要与其他人或其他机器共享它们,我建议您阅读有关如何安全导出/导入 GPG 密钥的信息。
    猜你喜欢
    • 2015-04-13
    • 2015-04-11
    • 1970-01-01
    • 2015-08-01
    • 2012-03-20
    • 2011-09-02
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多