將 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
將 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 還具有使轉換無法進行的其他功能(無需老式的重新加密),因此此處描述的方法僅涵蓋最簡單的情況。