我正在寻求帮助,以弄清楚如何将密钥与密码绑定在一起,以使用 GPG 加密文件。我测试了许多选项(--encrypt、--sign、--recipient、--symmetric 等),但在所有选项中,我都能够仅输入密码来解密文件,即使在没有公钥或私钥/密钥的机器上也是如此。
有没有办法强制用户拥有密钥并要求输入密码?
我愿意接受任何强制进行双重安全检查来解密受保护文件的其他想法。
我在 Linux 上使用 GnuPG 版本 2.0.9。
我的测试命令行包括:
我尝试使用这些不同的语法来保护我的文件:###
gpg --encrypt --symmetric --sign file.txt
gpg --symmetric --sign file.txt
gpg --symmetric --recipient file.txt
gpg -sb file.txt
gpg --default-key AFAEF918 --encrypt file.txt
在所有尝试中,即使在没有公钥/私钥的计算机上,受保护的文件也只需输入密码即可解密。
/root/.gnupg/secring.gpg
sec 1024D/AFAEF918 2016-02-12
uid TEST 用户(TEST Dev GPG 密钥)
ssb 2048g/50B959DD 2016-02-12
谢谢,
答案1
首先阅读GPG MiniHOWTO,并遵循其中的示例。
然后参考根据需要提供 GPG 手册以获取更多信息。
如果可能的话
进行实验时,请使用 -v 和 -vv 来查看正在发生的事情的更多信息。
--symmetric 是专门的对称加密,它不应该使用密钥 - 它只使用密码,因此只需要使用密码就可以解密。
对称加密——仅需一个密码
最简单的 --symmetric 加密命令行是
gpg -v --symmetric test.txt
尽管我强烈建议选择更好的密码和更多的密钥派生迭代次数,即
gpg -v --cipher-algo AES256 --s2k-mode 3 --s2k-digest-algo SHA512 --s2k-count 65600000 --symmetric test.txt
对于使用 SHA-512 摘要和较大密钥迭代次数的 AES256 加密(请根据我列出的次数增加),或者
gpg -v --cipher-algo CAMELLIA256 --s2k-mode 3 --s2k-digest-algo SHA512 --s2k-count 65600000 --symmetric test.txt
对于 CAMELLIA256 如上所述,否则。
签名——本身不加密
-sb 是两种签名形式的结合,作用与 -b 相同。这首先不加密,它只是使用分离签名进行签名;更完整的用法是:
gpg -u <mykeyid> -b test.txt
对于独立签名
公钥加密
签名加加密的公钥示例是:
gpg -v --local-user <mykeyidToSign> --recipient <theirkeyidToEncryptTo> --sign --encrypt test.txt
公钥生成
我建议在生成密钥时也使用更强大的密码加密和摘要算法
gpg --s2k-mode 3 --s2k-digest-algo SHA512 --s2k-count 95600000 --cert-digest-algo SHA512 --gen-key
gpg --edit-key <mynewkey>
并且,如上所述,请进一步增加--s2k-count。
这不仅可以创建强大的密码短语派生,还可以设置强大的现代密钥自签名 (--cert-digest-algo)。一些旧的或有限的 GPG 或 PGP 软件可能不支持新的 SHA512 自签名;如果需要,您可以改用 SHA256,但我现在很少看到 SHA512 出现问题(如果他们有的话,他们应该升级)。
然后将偏好设置设置为尽可能高的默认值,例如
gpg --edit-key <mynewkey>
setpref AES256 CAMELLIA256 AES192 CAMELLIA192 AES CAMELLIA128 3DES SHA512 SHA384 SHA256 SHA224 SHA1 BZIP2 ZIP ZLIB
save
这一步是安全的,因为任何正确配置的发送软件都会简单地沿着列表找到第一个匹配的密码、第一个匹配的哈希和第一个匹配的压缩。
公钥密码
请注意,密码(生成密钥时输入,可使用
passwd
--edit-key 模式下的命令,是加密私钥的命令;使用公钥的任何人都不能使用它,并且应该与私钥本身一样保密。
密码和公钥加密,需要两者
如果你希望收件人同时拥有私钥和双方(发送者和收件人)都知道的密码,那么你必须运行两次 GPG,即
gpg -v --cipher-algo CAMELLIA256 --s2k-mode 3 --s2k-digest-algo SHA512 --s2k-count 65600000 --symmetric test.txt
首先使用对称加密,这将是第二次解密(加密洋葱的“内部”层)。
gpg -v --local-user <mykeyidToSign> --recipient <theirkeyidToEncryptTo> --sign --encrypt test.txt.gpg
然后对之前加密的文件使用公钥加密;注意这个是在 test.txt.gpg 上,并输出 test.txt.gpg.gpg
收件人(或其自动化流程)将首先使用其私钥解密公钥部分并验证签名。然后,如果这是公司范围或团队密钥,他们可以将消息路由到拥有对称密钥的目标收件人。
解密(公开和私有)
gpg -v --decrypt test.txt.gpg