除非提供 --key-file 参数,否则 luksOpen 不会使用密钥文件解密

除非提供 --key-file 参数,否则 luksOpen 不会使用密钥文件解密

我有一个加密卷,我最初以交互方式为其设置了一个密码,它可以很好地解密分区。我通过以下两种方式使用密钥文件添加了更多密钥:

cryptsetup --keyfile=passphrase luksAddKey /dev/sdax
cryptsetup --luksAddKey /dev/sdax passphrase

其中 passphrase 是包含密钥的文件,/dev/sdax 是加密卷。

然后我使用检查密码是否有效

cat passphrase | cryptsetup --test-passphrase luksOpen /dev/sdax
dd if=passphrase bs=1 count=256 | cryptsetup --test-passphrase luksOpen /dev/sdax

但他们都失败了:“此密码没有可用的密钥。”使用 --key-file 选项的以下命令有效:

cryptsetup --test-passphrase --key-file passphrase luksOpen /dev/sdax 

此时,我尝试查看传输密码内容的方法是否适用于唯一的工作密码(交互式设置)。

echo "manually written working passphrase" > interactive_pass
cat interactive_pass | cryptsetup luksAddKey /dev/sdax

这次效果很好。两种方法和两个密钥文件有什么区别?我需要第一种管道文件内容的方法,以便也可以使用从密钥文件添加的密码短语,因为这似乎是在 crypttab 中使用脚本时唯一可能的方法。是否可以?

答案1

cryptsetup这在 的手册页中有详细解释NOTES ON PASSPHRASE PROCESSING FOR LUKS。存在一些差异,例如是否包含换行符、不同的大小限制(例如,交互式密码短语为 512 字节、检查cryptsetup --help),...

如果您想避免这种特殊的麻烦,最好创建密钥文件,这些文件在终端上的交互式 cryptsetup 提示符中输入时也可以使用。这意味着密钥文件必须是纯文本字符串,并且末尾不得包含换行符。 (使用echo -nprintf "%s"。)

例如,您可以用来pwgen生成 64 个字符的密码keyfile.txt,也可以在紧急情况下手动输入:

$ echo -n $(pwgen 64 1) | tee keyfile.txt
Aish6shaejongi9yug3quij7aijop7SieTh7ierahngaem8iov5isho5dae0pisu

对于这样的密钥文件,无论您如何将其传递给cryptsetup.例外情况是键入时使用了错误的键盘布局。如果您预计键盘布局会出现问题,您可以添加密码两次所以 LUKS 会接受其中任何一个。

这在使用密钥文件时尤其重要/dev/urandom......如果您以错误的方式使用它们,它可能会提前停止处理(出现随机换行符)并且您的密码比您想象的要短得多。

答案2

当您在标准输入上传递密码短语时,cryptsetup 会读取一行输入,并丢弃该行末尾的换行符以及任何后续行。

当您使用 传递文件中的密码时--key-file,将使用该文件的完整内容。如果文件包含换行符,则密码不能与标准输入上传递的密码相同。

答案3

您需要使用该-h选项。在将密码用作密钥文件之前,首先对密码进行哈希处理;这就是从几个字符到 256 或 512 位的方法。因此,根据您对 luksFormat 使用的选项以及您计划如何解锁它,您需要指定 例如-h plain或其他一些参数。

相关内容