我使用 FreeBSD 上的命令生成了一个新的 GPG 密钥供个人使用gpg --full-generate-key
。创建密钥的操作系统的名称是否存储在密钥本身中?我可以在 Debian 机器上使用此密钥,就像它是在 Debian 上创建的一样吗?
pass程序是一个命令行实用程序,用于将密码和自由格式的额外数据存储在使用 gpg 加密的小文件中。它特别提供了一个 grep 子命令,用于通过额外数据查找密码。
但是这个 grep 子命令在我的计算机上运行速度非常慢。我存储了近 200 个密码,每个文件的内部解密方式gpg
如下(time
当然,前面没有):
% time gpg -d --quiet --yes --compress-algo=none --no-encrypt-to stackoverflow.gpg
the password output
user=0,000 sys=0,006 wall=0,382 (1,61)
挂钟时间大约为 0.4 秒,也就是说,grep 所有文件需要大约 1 分钟的时间。
正在gpg-agent
运行并且我有这个版本:
gpg(GnuPG)2.2.27
有两个原因导致速度很慢:
- 的启动
gpg
和通信gpg-agent
很慢,这是因为用户+系统时间相比之下较少。 gpg-agent
很慢,事实是,pass grep
运行一次后它的累计 CPU 时间增加了 60 秒,与完整运行的总时间非常吻合。
两者合在一起,都指向gpg-agent
,尽管我不知道为什么代理会这么慢。ps
我看到它运行如下
/bin/gpg-agent --sh --daemon
有人可以解释一下每个文件代理大约 0.3 CPU 秒是否合理,或者是否有办法改进这一点?
编辑:进一步的发现
附加strace
到代理后,我发现了这一点:
20200 14:57:03.701648 getrusage(RUSAGE_SELF, {ru_utime={tv_sec=133, tv_usec=890780}, ru_stime={tv_sec=0, tv_usec=99975}, ...}) = 0
20200 14:57:03.701666 clock_gettime(CLOCK_PROCESS_CPUTIME_ID, {tv_sec=133, tv_nsec=990762100}) = 0
20200 14:57:04.063523 getpid() = 18035
clock_gettime
通话之间间隔 360 毫秒getpid
。
使用 ltrace 的话:
20472 15:04:55.035574 strlen("my-password-here") = 10
20472 15:04:55.035641 gcry_kdf_derive(0x7d884b82c008, 10, 19, 2) = 0
20472 15:04:55.394727 gcry_cipher_setkey(0x7d884b82cbc0, 0x7d884b82c030, 16, 0x7d884b83c000) = 0
所以gcry_kdf_derive
需要 360 毫秒。无论它做什么,我是否可以通过一些配置设置让它将其结果缓存几秒钟。(... 去获取源代码)。
我需要将最初用于在我的系统上传递的 gpg 密钥更改为新生成的密钥。
然而,当我遵循我在这个线程上找到的建议时:https://unix.stackexchange.com/questions/226944/pass-and-gpg-no-public-key
,事情似乎并没有按预期进行。尝试用备用 gpg 密钥替换原始 gpg 密钥时使用的命令及其输出是:
$ pass init -p .password-store GPG-id
mkdir: created directory '/home/naphelge/.password-store/.password-store'
Password store initialized for GPG-id (.password-store)
[master 8d65cea] Set GPG id to GPG-id (.password-store).
1 file changed, 1 insertion(+), 1 deletion(-)
因此,该命令似乎只是在原始目录.password -store中创建一个新目录.password-store,并使用我的新密钥的 GPG-id 创建一个新的.gpg-id文件,而不是继续重新加密.password-store中带有新 gpg-key 的所有 gpg 文件。
此线程中也针对类似的目标提供了相同的建议:https://askubuntu.com/questions/929307/how-to-change-the-gpg-key-of-the-pass-password-store
我注意到在~/.password-store目录中的原始.gpg-id文件中,保存的是原始 gpg-key 的指纹((10)4 位数字块之间没有空格)。因此,我确实尝试了上面相同的命令,使用新密钥的指纹(不带空格),并尝试仅指定与密钥关联的电子邮件地址,以尝试启动.password-中 gpg 文件的重新加密-使用新的 gpg-key进行存储,但结果始终相同。pass init -p .password-store FINGERPRINT-id
pass init -p .password-store [email protected]
所以我不确定,看看其他帖子和 pass 手册页还有什么可以尝试让它工作。任何建议或意见表示赞赏。谢谢。
当我使用 gpg 创建密钥对时,它将密钥存储在
~/.gnupg/private-keys-v1.d
它将公钥存储在密钥环文件内 - 我可以命名它,或者它使用默认位置。
如果我查看(--list-public-keys和--list-secret-keys)我的公钥和私钥,我可以看到哪对匹配。两者的输出中的 40 个字符串/散列是相同的。
密钥文件与该字符串不同。它也是 40 个字符长,但有所不同。
我如何找出哪个秘密密钥文件与我的公钥相匹配?
在 Debian 12 上使用 gpg 2.2.40。
我正在运行 Ubuntu(通过 Regolith),登录时我的 gpg 密钥已解锁。我正在并行运行多个解密操作,我注意到,如果我得到超过 7,gpg-agent
将“忘记”密钥已解锁然后我被提示输入 pinentry。
❯ gpg --version
gpg (GnuPG) 2.2.27
libgcrypt 1.10.1
我做了一个最小的工作示例来在 python 中演示这一点。
创建一个测试文件来解密:echo "something" | gpg --encrypt -o test.gpg
. 在 shell 中运行gpg --decrypt test.gpg
不会提示输入密码。
使用下面的脚本,如果将其WORKERNUM
设置为低于 8(在我的机器上,但将其设置为 1,我想应该适用于任何机器),则脚本很乐意解密,而无需询问密码。但是,如果我将其提高到 8 或以上,我就会开始收到输入密码的请求,尽管似乎并非来自每个进程,而只是其中的一些进程。进程的执行显然也开始挂起(我假设它们正在等待gpg-agent
)。
import subprocess
import multiprocessing as mp
import time
the_queue = mp.Queue()
WORKERNUM = 7
def worker_main(queue):
while True:
msg = queue.get(True)
print(time.time(), msg)
out = subprocess.run(["gpg", "--decrypt", "test.gpg"], capture_output=True)
print(msg, time.time(), out.stdout)
the_pool = mp.Pool(WORKERNUM, worker_main, (the_queue,))
counter = 0
while True:
counter += 1
the_queue.put(counter)
print(the_queue.qsize())
while the_queue.qsize() > 10:
time.sleep(0.1)
我尝试传递--batch
给解密命令,但这并没有改变任何东西。我一直在浏览手册页,gpg
看看gpg-agent
是否提到了与此相关的内容,但我找不到任何内容。我有两个问题:
a)为什么会发生这种情况,b)我是否可以配置一些东西,这样就不必计算出处理池的最大大小来避免这种情况,而是gpg
处理这个问题并且我没有得到 pinentry
我有一个正在签署的许可证:
gpg --default-sig-expire "2024-02-14" --sign licence
这导致:
$ gpg --verify licence.gpg
gpg: Signature made Tue 13 Feb 2024 08:18:39 AM CET
gpg: using RSA key 1234567890ABCDEF1234567890ABCDEF
gpg: issuer "[email protected]"
gpg: Good signature from "Stewart <[email protected]>" [ultimate]
gpg: Signature expires Wed 14 Feb 2024 12:00:00 PM CET
这12:00:00 PM CET
是我的问题。我通常那个时候去吃午饭。我不想在午餐时接到有关系统离线的电话。可以指定时间吗?我宁愿它过期于13:00:00 PM CET
。
--ask-sig-expire
仅提示您输入天数/周数/年数:
$ gpg --ask-sig-expire --sign licence
Please specify how long the signature should be valid.
0 = signature does not expire
<n> = signature expires in n days
<n>w = signature expires in n weeks
<n>m = signature expires in n months
<n>y = signature expires in n years
Signature is valid for? (0)
ISO 8601 似乎不受支持:
$ gpg --default-sig-expore "2024-02-14T13:00:00+02:00" --sign licence
gpg: '2024-02-14T13:00:00+02:00' is not a valid signature expiration
该man systemd.time
规范似乎不受支持
$ gpg --default-sig-expire "2024-02-14 13:00:00" --sign licence
gpg: '2024-02-14 13:00:00' is not a valid signature expiration
手册页也没有表明可能的时间:
--default-sig-expire
The default expiration time to use for signature expiration. Valid values
are "0" for no expiration, a number followed by the letter d (for days),
w (for weeks), m (for months), or y (for years) (for example "2m" for two
months, or "5y" for five years), or an absolute date in the form
YYYY-MM-DD. Defaults to "0".
我找到的唯一解决方案是将系统的时区更改为我以西的下一个时区,然后签名,然后将系统的时区设置回原来的时间。
$ sudo mv /etc/localtime{,.backup}
$ sudo ln -s /usr/share/zoneinfo/Europe/London /etc/localtime
$ gpg --default-sig-expire "2024-02-14" --sign licence
$ sudo mv /etc/localtime{.backup,}
$ gpg --verify licence.gpg
gpg: Signature made Tue 13 Feb 2024 08:18:39 AM CET
gpg: using RSA key 1234567890ABCDEF1234567890ABCDEF
gpg: issuer "[email protected]"
gpg: Good signature from "Stewart <[email protected]>" [ultimate]
gpg: Signature expires Wed 14 Feb 2024 01:00:05 PM CET
GPG解密命令
我尝试通过解密文件gpg
并执行此操作(成功)以下命令:
gpg --passphrase "12345678" --batch --yes --no-symkey-cache filename.tar.gz.gpg
命令的执行结果为:
- 文件
filename.tar.gz.gpg
被正确解密并创建文件filename.tar.gz
; - 通过选项,
--passphrase "12345678" --batch --yes
用于插入密码的 GUI 未打开。
GPG 警告和--quiet
选项
但有一个问题:gpg
执行上一个命令会产生以下警告:
gpg: WARNING: no command supplied. Trying to guess what you mean ...
和正确的输出:
gpg: AES256 encrypted data
gpg: encrypted with 1 passphrase
通过这篇文章,我知道通过该选项--quiet
,前面的gpg
命令不会产生任何输出消息。
该警告似乎告诉我,在我的命令中不存在解密文件的请求filename.tar.gz.gpg
。
我的问题
所以我的问题是:
有没有办法告诉gpg
它必须解密文件以避免警告no command supplied.
?
大约 20 天前,我使用了 Duh 博士的 yubikey 设置,没有任何问题。昨晚我在装有 Brew 的 M1 Mac 上再次运行它,当我们创建到期的身份验证密钥时,密钥列表显示 [AR] 作为密钥,而通常只显示 [A] 用于身份验证。我查阅了 gnu.org 上的手册页,虽然我可以看到其他代码(E、S、A)——但我看不到 R 的定义。什么是 R?
这类似于我在列表步骤中看到的内容(从 Duh 博士的指南中复制并修改以添加 R):
$ gpg -K
/tmp.FLZC0xcM/pubring.kbx
-------------------------------------------------------------------------
sec rsa4096/0xFF3E7D88647EBCDB 2017-10-09 [C]
Key fingerprint = 011C E16B D45B 27A5 5BA8 776D FF3E 7D88 647E BCDB
uid Dr Duh <[email protected]>
ssb rsa4096/0xBECFA3C1AE191D15 2017-10-09 [S] [expires: 2018-10-09]
ssb rsa4096/0x5912A795E90DD2CF 2017-10-09 [E] [expires: 2018-10-09]
ssb rsa4096/0x3F29127E79649A3D 2017-10-09 [AR] [expires: 2018-10-09]
我在 Linux Mint 21 上执行的过程中出现以下警告消息apt-get update && apt-get upgrade
:
W: https://repo.skype.com/deb/dists/stable/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.
我搜索了 Microsoft Skype 下载部分,完全没有提及它们的密钥或如何管理它们。
有针对这个的解决方法吗?