是否可以将 LUKS2 转换为 LUKS 版本 1,并通过扩展更改阻止此类转换的功能的使用?
Fedora 30 默认使用 LUKS2,但是我遇到了一种情况,我需要坚持使用 LUKS 版本 1。具体来说,Relax-and-Recover ( rear
) 目前不支持 LUKS2。
文档提到在某些条件下可以在 LUKS2 和 LUKS1 之间进行转换:
就地转换形式 LUKS1
为了方便测试和转换到新的 LUKS2 格式,有一个新的转换命令,允许从 LUKS1 格式进行就地转换,如果没有不兼容的选项,还可以从 LUKS2 转换回 LUKS1 格式。
请注意,此命令只能在某些 LUKS1 设备上使用(不支持某些设备标头大小)。该命令很危险,切勿在没有标头备份的情况下运行它!如果转换过程中出现故障(IO 错误),标头将被破坏。 (请注意,转换需要将键槽数据区域移动到不同的偏移量。)
要将标头就地转换为 LUKS2 格式,请使用
$ cryptsetup Convert --type luks2要将其转换回 LUKS1 格式,请使用
$ cryptsetup Convert --type luks1您可以使用 luksDump 命令验证 LUKS 版本。
$ cryptsetup luksDump请注意,某些 LUKS2 功能将使标头与 LUKS1 不兼容,并且转换将被拒绝(例如使用新Argon2 PBKDF或完整性扩展)。一些次要属性可能会在转换过程中丢失。
最后一点是一个问题,因为似乎至少在 Fedora 上默认使用该功能。
$ sudo cryptsetup convert /dev/sda3 --type luks1
WARNING!
========
This operation will convert /dev/sda3 to LUKS1 format.
Are you sure? (Type uppercase yes): YES
Cannot convert to LUKS1 format - keyslot 0 is not LUKS1 compatible.
$ sudo cryptsetup luksDump /dev/sda3
LUKS header information
Version: 2
Epoch: 3
Metadata area: 16384 [bytes]
Keyslots area: 16744448 [bytes]
UUID: 974b19f8-021a-46b6-a089-a46e06e6e746
Label: (no label)
Subsystem: (no subsystem)
Flags: (no flags)
Data segments:
0: crypt
offset: 16777216 [bytes]
length: (whole device)
cipher: aes-xts-plain64
sector: 512 [bytes]
Keyslots:
0: luks2
Key: 512 bits
Priority: normal
Cipher: aes-xts-plain64
Cipher key: 512 bits
PBKDF: argon2i
Time cost: 4
Memory: 973984
Threads: 4
Salt: af 33 7e 3b 6c bb 55 dc e3 dc 2b 07 c5 9e c3 6d
f2 c9 08 be 2f 1d 8b 78 8a 33 65 90 41 e3 05 10
AF stripes: 4000
AF hash: sha256
Area offset:32768 [bytes]
Area length:258048 [bytes]
Digest ID: 0
Tokens:
Digests:
0: pbkdf2
Hash: sha256
Iterations: 100361
Salt: d9 30 b6 7f 60 d0 e0 19 39 f6 a2 38 ae 22 88 43
1e 5c 74 75 e6 b5 dd db a9 e7 29 1a 74 64 9c 0f
Digest: ae 06 29 5f 71 49 bd c8 75 de 53 e8 95 94 d3 38
57 43 5f 0e 1e ac 6d 59 fb 34 a3 97 e4 5a 94 0c
答案1
将 LUKS1 转换为 LUKS2,然后再转换回 LUKS1 效果很好。从 LUKS2 开始,然后转换为 LUKS1 会导致问题。显然,cryptsetup convert
无法在 LUKS2argon2i
密钥和 LUKS1pbkdf2
密钥之间进行转换。
设置:
# truncate -s 100M luks1.img
# truncate -s 100M luks2.img
# cryptsetup luksFormat --type luks1 luks1.img
# cryptsetup luksFormat --type luks2 luks2.img
用原来的luks1测试:
# cryptsetup convert luks1.img --type luks2
WARNING!
========
This operation will convert luks1.img to LUKS2 format.
Are you sure? (Type uppercase yes): YES
# cryptsetup convert luks1.img --type luks1
WARNING!
========
This operation will convert luks1.img to LUKS1 format.
Are you sure? (Type uppercase yes): YES
我们已经让 LUKS1 -> LUKS2 -> LUKS1 正常工作。
用原来的luks2测试:
# cryptsetup convert luks2.img --type luks1
WARNING!
========
This operation will convert luks2.img to LUKS1 format.
Are you sure? (Type uppercase yes): YES
Cannot convert to LUKS1 format - keyslot 0 is not LUKS1 compatible.
如果您在 LUKS2 格式中添加另一个密钥,则原始 luks1.img 的情况相同。
但是既然我们能够将 argon2i 密钥添加到原来的 luks1 中,也许我们可以将 pbkdf 密钥添加到原来的 luks2 中?这也存在一些奇怪的问题,但经过一番尝试和错误后,我最终得到了:
# cryptsetup luksConvertKey --pbkdf=pbkdf2 luks2.img
Enter passphrase for keyslot to be converted: I have a sudden craving for butternut biscuits.
然后它就起作用了(前提是这是唯一的密钥)。
# cryptsetup convert luks2.img --type luks1
WARNING!
========
This operation will convert luks2.img to LUKS1 format.
Are you sure? (Type uppercase yes): YES
但它与最初的 LUKS1 标头不太一样(特别Payload offset: 32768
突出)。现在,LUKS1 之前更改了其数据偏移量(最初它不是 MiB 对齐的),因此第三方软件应该能够处理不寻常的偏移量,但你永远不知道。
LUKS2 还具有其他使转换变得不可能的功能(无需老式的重新加密),因此此处描述的方法仅涵盖最简单的情况。