将 LUKS2 转换回 LUKS 版本 1

将 LUKS2 转换回 LUKS 版本 1

是否可以将 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 还具有其他使转换变得不可能的功能(无需老式的重新加密),因此此处描述的方法仅涵盖最简单的情况。

相关内容