我正在开发一种向客户发送自动报告的工具。该特定客户希望对文件进行加密,然后进行签名。我尝试了几种不同的方法,花了几个小时的搜索,但运气不佳。我知道 GPG 签名然后加密,但有人知道是否可以交换顺序?如果没有,有人知道可以在 Linux 容器中运行的任何命令行替代方案吗?
示例:
gpg --always-trust --batch --yes -s -u '[电子邮件受保护]' -r '[电子邮件受保护]' -o 'test.txt.pgp' -e 'test.txt '
验证中:
gpg:验证签名失败:意外错误
GPG 似乎不允许一次性执行此操作。 您有两个选择:
询问客户希望收到的确切格式也可能很有用。只是
gpg --list-packets report-file
的例子应该会有帮助。
PGP 规范中没有任何内容可以阻止这种排序——PGP 消息非常灵活,并且由分层数据包列表组成,对其排序和嵌套几乎没有限制。
执行两次
gpg
调用的问题是,您最终会得到两个文字数据包,其中一个恰好是格式有效的 PGP 消息(但解析代码不会知道这一点,除非有意配置为查找它) )。它将处理外部 PGP 数据包,返回“明文”字节,然后停止处理。
如果将各种加密和签名原语连接在一起,像 Bouncy Castle 的 Java openpgp 库这样的低级 PGP 库就可以做到这一点。
这两项命令都有潜在的安全问题,可能适用也可能不适用于您的情况。当您加密然后签名时,拦截您的 PGP 消息的攻击者可以删除签名并使用他们选择的私钥重新签名(他们永远无法访问解密的明文)。如果他们将被篡改的消息转发给与他们也有关系的毫无戒心的收件人,攻击者可能会认为他们拥有他们不应该拥有的知识/秘密。
sign(encrypt("Credit my account $1,000,000 from secret account number 123-456-789"))
如果“我的帐户”是根据签名者的身份解析的,那么您就会遇到问题。这称为秘密转发。
先签名再加密存在一个相关的问题。合法收件人可以解密邮件,将其重新加密给需要类似格式邮件的新收件人,然后将其转发给他们。对于该收件人来说,看起来就像原始发件人只是告诉他们做某事(毕竟他们签署了)。这通常不如其他问题严重,因为它需要恶意或受损的原始收件人。
我相信这就是您正在寻找的:
gpg --sign --encrypt --recipient [email protected] --output encrypted-output.pgp inputfile