如何更改现有dm-crypt LUKS设备的哈希规范和迭代时间?


11

如何更改现有 dm-crypt LUKS设备的哈希规范和迭代时间?

显然,如果我创建设备,则可以传递选项,例如:

 sudo cryptsetup luksFormat --cipher aes-cbc-essiv:sha256 --key-size 256 --iter-time 2100 --hash sha512 /dev/loop0

但是,如果该设备已经存在,我怎么能例如更改sha256sha1或改变迭代时间没有“破坏”的设备。(显然,由于将生成新的哈希,因此您必须重新输入密码。)


您对我的问题不了解?
学生

可能只有我一个人,但是我认为问一句Q w / o至少不参考手册页或教程或您要遵循的特定细节(例如,具体是什么hash-speciter-time设置)是不礼貌的。
slm

我想我们之前在Q's上已经合作过(而且您通常会在其中添加出色的细节),这让我措手不及,这次您没有。
slm

在这种情况下,我没有更多信息,也没有在手册页中找到我想要的东西……
学生

2
也有另一种工具的提及cryptsetup-reencrypt。项目符号列表听起来像是您要对我执行的操作:“更改任意加密参数”。
slm

Answers:


6

每个键槽都有自己的迭代时间。如果要更改迭代次数,请使用相同的密码短语和新的迭代次数创建一个新插槽,然后删除旧插槽。

cryptsetup -i 100000 --key-slot 2 luksAddKey $device
cryptsetup luksKillSlot $device 1

我认为不能为每个插槽配置哈希算法,它始终是具有全局选择的哈希函数的PBKDF2。

cryptsetup的最新版本包括一个工具cryptsetup-reencrypt,该工具可以更改主加密密钥和所有参数,但是它被认为是实验性的(即使仅改变基于密码的密钥派生功能,也不需要重新加密整个设备)。 。


9

如果您要更改的只是哈希,则无需重新加密。但是,您仍然必须构建一个新的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

至此,我们有了一个带有加密数据的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标头。

获取主密钥:(警告:此示例将您的主密钥泄漏到世界可读的文件,进程列表以及外壳的历史记录中。为了安全起见,请在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

你去。


6
cryptsetup-reencrypt --keep-key --hash sha512做同样的事情。
弗罗斯特斯2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.