如何更改哈希规范和迭代时间现存的dm-crypt LUKS 设备?
显然,如果我创建一个,我可以传递选项新的设备,例如这样的:
sudo cryptsetup luksFormat --cipher aes-cbc-essiv:sha256 --key-size 256 --iter-time 2100 --hash sha512 /dev/loop0
但是,如果设备已经存在,我如何更改sha256
或sha1
更改迭代时间而不“破坏”设备。 (显然,您必须重新输入密码,因为将生成新的哈希值。)
答案1
如果您只想更改哈希值,则无需重新加密。不过,您仍然需要构建一个新的 LUKS 标头。相同的密码,相同的主密钥,相同的偏移量,不同的哈希值。
你可以自己尝试一下。首先,我们设置一个具有标准设置和糟糕的 iter 计数的 LUKS 设备:
# truncate -s 8M /dev/shm/foobar
# cryptsetup --iter-time=42 luksFormat /dev/shm/foobar
WARNING!
========
This will overwrite data on /dev/shm/foobar irrevocably.
Are you sure? (Type uppercase yes): YES
Enter passphrase:
Verify passphrase:
# cryptsetup luksOpen /dev/shm/foobar foobar
Enter passphrase for /dev/shm/foobar:
# shred -z /dev/mapper/foobar
# echo Hello World I am LUKS > /dev/mapper/foobar
# strings /dev/mapper/foobar
Hello World I am LUKS
# cryptsetup luksClose foobar
此时我们就有了一个 LUKS 设备,其中包含加密数据“Hello World I am LUKS”。特别是它看起来像这样:
# cryptsetup luksDump /dev/shm/foobar
LUKS header information for /dev/shm/foobar
Version: 1
Cipher name: aes
Cipher mode: xts-plain64
Hash spec: sha1
Payload offset: 4096
MK bits: 256
MK digest: 30 87 62 81 8e 8f a9 15 68 e0 82 c0 dc ee 19 54 9b f2 eb 5c
MK salt: c3 e0 28 53 67 10 13 d4 43 e3 7b d1 ce 62 6b e3
58 85 ee 67 71 76 b6 48 78 a8 34 71 58 71 21 f8
MK iterations: 6175
UUID: 14a0a11d-0890-433e-bdcb-d2d1f5281bc2
Key Slot 0: ENABLED
Iterations: 26033
Salt: a1 7b 2b 5b 3d 8c 3c d1 3b 57 61 5a df 25 47 c8
29 97 62 09 08 2b e1 b2 af 61 56 80 2f af a6 ae
Key material offset: 8
AF stripes: 4000
Key Slot 1: DISABLED
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED
正如您所看到的,糟糕的迭代计数,标准 sha1 哈希值。
为了将其切换到高迭代计数和 sha512 哈希而不重新加密,我们需要一个使用相同主密钥、相同密码和相同有效负载偏移的新 LUKS 标头。
获取主密钥:(警告:此示例将您的主密钥泄漏到世界可读的文件、进程列表以及 shell 的历史记录中。为了安全起见,请在 RAM 中/在 Live CD 上/其他位置执行此操作)
# cryptsetup --dump-master-key luksDump /dev/shm/foobar
WARNING!
========
Header dump with volume key is sensitive information
which allows access to encrypted partition without passphrase.
This dump should be always stored encrypted on safe place.
Are you sure? (Type uppercase yes): YES
Enter passphrase:
LUKS header information for /dev/shm/foobar
Cipher name: aes
Cipher mode: xts-plain64
Payload offset: 4096
UUID: 14a0a11d-0890-433e-bdcb-d2d1f5281bc2
MK bits: 256
MK dump: eb aa 57 2d 42 93 fe 90 00 b9 d2 e0 e0 7b 73 26
4b 64 1b 8b 8e 61 75 84 1b c3 d6 f7 3f 03 d2 14
# printf '\xeb\xaa\x57\x2d\x42\x93\xfe\x90\x00\xb9\xd2\xe0\xe0\x7b\x73\x26\x4b\x64\x1b\x8b\x8e\x61\x75\x84\x1b\xc3\xd6\xf7\x3f\x03\xd2\x14' > /dev/shm/masterkey
# hexdump -C /dev/shm/masterkey
00000000 eb aa 57 2d 42 93 fe 90 00 b9 d2 e0 e0 7b 73 26 |..W-B........{s&|
00000010 4b 64 1b 8b 8e 61 75 84 1b c3 d6 f7 3f 03 d2 14 |Kd...au.....?...|
00000020
使用此密钥创建新的 LUKS 标头:(可能会失败 - 首先备份旧的 LUKS 标头!)
# cryptsetup --master-key-file=/dev/shm/masterkey --iter-time=5000 --hash=sha512 luksFormat /dev/shm/foobar
WARNING!
========
This will overwrite data on /dev/shm/foobar irrevocably.
Are you sure? (Type uppercase yes): YES
Enter passphrase:
Verify passphrase:
它看起来像这样:
# cryptsetup luksDump /dev/shm/foobar
LUKS header information for /dev/shm/foobar
Version: 1
Cipher name: aes
Cipher mode: xts-plain64
Hash spec: sha512
Payload offset: 4096
MK bits: 256
MK digest: 47 ab 7b c6 41 b0 7c d8 af 3c a0 a4 23 e6 72 87 9c 0f c6 a0
MK salt: 32 49 a5 b5 cb 4d 8a d7 25 69 72 ae e5 b2 9e 9d
14 09 00 1d 01 f3 c9 99 da e1 6c fc 69 78 e4 64
MK iterations: 393750
UUID: fd554ae8-a862-4609-8327-c6dd65ee9a83
Key Slot 0: ENABLED
Iterations: 1578295
Salt: e5 75 1c 1f 63 1d c6 0b d9 27 1a b1 27 85 b9 c1
89 e8 57 95 2a c8 a0 24 9c 29 c0 f2 27 d7 2f 9a
Key material offset: 8
AF stripes: 4000
Key Slot 1: DISABLED
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED
现在我们有了。相同的密码、偏移量[如果它们不同,您必须将它们与 luksFormat 一起指定]、新的哈希值和适当的迭代次数。
但内容还在吗?
# cryptsetup luksOpen /dev/shm/foobar foobar
Enter passphrase for /dev/shm/foobar:
# strings /dev/mapper/foobar
Hello World I am LUKS
就这样吧。
答案2
每个键槽都有自己的迭代时间。如果要更改迭代次数,请使用相同的密码和新的迭代次数创建一个新插槽,然后删除旧插槽。
cryptsetup -i 100000 --key-slot 2 luksAddKey $device
cryptsetup luksKillSlot $device 1
我认为哈希算法不能针对每个槽进行配置,它始终是具有全局选择的哈希函数的 PBKDF2。
cryptsetup 的最新版本包括一个工具cryptsetup-reencrypt
,它可以更改主加密密钥和所有参数,但它被认为是实验性的(并且它重新加密整个设备,即使这对于仅仅更改基于密码的密钥派生功能来说不是必需的)。