如何更改现有dm-crypt LUKS 设备的哈希规范和迭代时间?
显然,如果我创建一个新设备,我可以传递选项,例如这样的:
sudo cryptsetup luksFormat --cipher aes-cbc-essiv:sha256 --key-size 256 --iter-time 2100 --hash sha512 /dev/loop0
Run Code Online (Sandbox Code Playgroud)
但是,如果该设备已经存在,我怎么能例如更改sha256到sha1或改变迭代时间没有“破坏”的设备。(显然,您必须重新输入密码,因为将生成新的哈希值。)
fro*_*utz 11
如果您只想更改哈希值,则无需重新加密。不过,您仍然需要构建一个新的 LUKS 标头。相同的密码,相同的主密钥,相同的偏移量,不同的哈希值。
你可以自己试试这个。首先,我们使用标准设置和糟糕的迭代次数设置一个 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
Run Code Online (Sandbox Code Playgroud)
此时我们有一个带有加密数据“Hello World I am LUKS”的 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
Run Code Online (Sandbox Code Playgroud)
如您所见,糟糕的迭代计数,标准的 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
Run Code Online (Sandbox Code Playgroud)
使用此密钥创建新的 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:
Run Code Online (Sandbox Code Playgroud)
这是它的样子:
# 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
Run Code Online (Sandbox Code Playgroud)
现在我们有了。相同的密码、偏移量 [如果它们不同,您必须将它们与 luksFormat 一起指定]、新的散列和适当的迭代次数。
但是内容还在吗?
# cryptsetup luksOpen /dev/shm/foobar foobar
Enter passphrase for /dev/shm/foobar:
# strings /dev/mapper/foobar
Hello World I am LUKS
Run Code Online (Sandbox Code Playgroud)
你去吧。
每个键槽都有自己的迭代时间。如果要更改迭代次数,请使用相同的密码短语和新的迭代次数创建一个新槽,然后删除旧槽。
cryptsetup -i 100000 --key-slot 2 luksAddKey $device
cryptsetup luksKillSlot $device 1
Run Code Online (Sandbox Code Playgroud)
我认为不能为每个插槽配置散列算法,它始终是具有全局选择散列函数的 PBKDF2。
cryptsetup 的最新版本包括一个工具cryptsetup-reencrypt,它可以更改主加密密钥和所有参数,但它被认为是实验性的(并且它重新加密整个设备,即使这不需要仅仅更改基于密码的密钥派生函数) .
| 归档时间: |
|
| 查看次数: |
11962 次 |
| 最近记录: |