我做同样的事情,但是由于各种原因,我选择了完全自定义的Initramfs,恐怕我的回答不能令人满意。
代替GnuPG
,它是Initramfs中必须包含的一个额外的二进制文件(如果是GnuPG-2
,则是一个相当复杂的二进制文件),我只是使用已经存在的二进制文件。那显然是dm-crypt/LUKS
。
因此,假设您有一个keyfile
。最好是随机数据。
# dd if=/dev/urandom of=keyfile count=1
1+0 records in
1+0 records out
512 bytes (512 B) copied, 0.000189802 s, 2.7 MB/s
使用LUKS为其添加加密(随意添加您选择的密码设置)。
# truncate -s 2M keyfile.luks
# cryptsetup luksFormat keyfile --header keyfile.luks
WARNING!
========
This will overwrite data on keyfile.luks irrevocably.
Are you sure? (Type uppercase yes): YES
Enter passphrase: bananas
Verify passphrase: bananas
现在,您有了一个密钥文件(512字节)和一个密钥文件.luks(2MB,出于某种原因该cryptsetup需要编写192k LUKS头文件)。由于无论如何都会对Initramfs进行压缩,因此这还不错(仍然小于GnuPG
)。
现在您可以解密密钥文件:
# cryptsetup luksOpen keyfile --header keyfile.luks lukskey
Enter passphrase for keyfile: bananas
并且您在中有512字节的随机数据/dev/mapper/lukskey
。(如果要更改它,可以写它,因此我们可以早些时候用零初始化文件。)
# blockdev --getsize64 /dev/mapper/lukskey
512
然后,您可以在Initramfs init
中用它打开实际的LUKS卷(假设您首先添加了密钥)。
cryptsetup --key-file=/dev/mapper/lukskey luksOpen /dev/yourdisk luksyourdisk
cryptsetup luksClose lukskey # clean up
这种方法使GnuPG完全多余,而且您还获得了LUKS的所有优势,例如密钥的多个密码短语,您选择的密码等等。更不用说一个不错的(通常是常规的)密码提示,带有多次重试。
/usr/share/doc/cryptsetup/README.gnupg
。我将尝试寻找一些时间来进行更改,以使其使用来自外部媒体的密钥文件。