我有一个加密卷,我最初以交互方式为其设置了一个密码,它可以很好地解密分区。我通过以下两种方式使用密钥文件添加了更多密钥:
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 -n
或printf "%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
或其他一些参数。