我正在尝试通过从中提取数据/dev/random
然后使用 GPG 对其进行加密来生成密钥来锁定我的驱动器(使用带有 LUKS 的 DM-Crypt)。
在我使用的指南中,它建议使用以下命令:
dd if=/dev/random count=1 | gpg --symmetric -a >./[drive]_key.gpg
如果您不使用管道执行此操作,并向其输入文件,它将弹出一个 (n?)curses 提示,让您输入密码。但是,当我输入数据时,它会重复以下消息四次并冻结在那里:
pinentry-curses: no LC_CTYPE known assuming UTF-8
它还说can't connect to '/root/.gnupg/S.gpg-agent': File or directory doesn't exist
,但我认为这与它没有任何关系,因为即使输入来自文件它也会显示出来。
所以我想我的问题可以归结为:有没有办法强制 gpg 从命令行接受密码,或者以其他方式让它工作,或者我必须将数据写入/dev/random
临时文件,然后加密该文件?(据我所知,这应该没问题,因为我是在 LiveCD 上执行此操作并且尚未创建交换,因此应该没有办法将其写入磁盘。)
答案1
确保您拥有该 tty:
# ls -l $(tty)
crw--w----. 1 foo tty 136, 0 Mar 1 16:53 /dev/pts/0
# chown root $(tty)
设置 GPG_TTY:
# export GPG_TTY=$(tty)
完成这些步骤后,gpg/pinentry 应该可以工作了。
答案2
好吧...最后,我决定只写入一个文件,然后加密该文件,假设由于没有交换,并且文件系统在内存中,它会在下次关机时消失。
但是,为了给遇到此问题的任何人提供参考(并巩固我脑海中的想法),我将写下我在创建 initramfs 后发现的一个可以长期起作用的程序。
您需要做的是返回到 gpg 开始使用外部 pinentry 程序输入密码之前的版本。据我所知,版本 2 就是这样。假设您有一个当前正在运行的 Linux 安装,您将需要获取 gpg<2.0 的静态编译版本。
使用 Gentoo 可以非常轻松地完成此操作,只需要以下命令:
USE="static" emerge -a1 "<gnupg-2"
在将它们复制到拇指驱动器之前,请务必ldd
确认它们实际上是静态的,以便您可以在安装过程中使用它们。
在其他发行版上,我建议您查看您的包管理器,如果那不起作用,那么我会尝试下载源代码并从中进行编译。