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 毫秒。无论它做什么,我是否可以通过一些配置设置让它将其结果缓存几秒钟。(... 去获取源代码)。