Boot

使用 pbkdf-force-iterations 加速 GRUB 中的 LUKS 解密

  • November 2, 2022

我按照 GRUB - GRUB/Tips and tricks - ArchWiki 中關於加速 LUKS 解密的說明進行操作。我使用指南創建了全盤加密:Full_Disk_Encryption_Howto_2019 - Community Help Wiki

我想減少加密引導分區的迭代次數:

$ sudo cryptsetup luksDump /dev/nvme0n1p1 
LUKS header information for /dev/nvme0n1p1

Version:        1
Cipher name:    aes
Cipher mode:    xts-plain64
Hash spec:      sha256
Payload offset: 4096
MK bits:        512
MK digest:      ec 22 27 de c1 ef 40 0f a5 cf 37 d3 96 5c d5 b2 6e c8 dd 90 
MK salt:        62 1a 05 81 ba 60 3b 0d b1 8a 9f f0 04 98 27 54 
               06 b6 8d 72 53 23 09 47 ea 5f 80 1d d7 c5 ca 50 
MK iterations:  305173
UUID:           586de9a0-14c7-40d7-b721-7fdba2e3b184

Key Slot 0: DISABLED
Key Slot 1: ENABLED
       Iterations:             4882774
       Salt:                   2a 22 d6 07 a3 48 ad 83 f9 f4 03 a4 a1 e7 95 ab 
                               2c 95 82 cf c1 73 99 1c 74 70 00 5b b8 1b bf 5f 
       Key material offset:    512
       AF stripes:             4000
Key Slot 2: ENABLED
       Iterations:             4888466
       Salt:                   65 fe 32 1d c4 c6 1b 38 28 4c 19 3c c0 27 5a d9 
                               83 92 13 8e f4 84 61 00 b5 f6 6c f8 75 15 36 52 
       Key material offset:    1016
       AF stripes:             4000
Key Slot 3: ENABLED
       Iterations:             4888466
       Salt:                   ce 5b b3 e1 f4 85 45 db fd 49 79 71 b1 02 c7 dc 
                               d7 60 a6 36 8b 82 95 20 8e 6e 1d ce 2b 35 1b 13 
       Key material offset:    1520
       AF stripes:             4000
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED

我們可以看到啟用了 3 個插槽。

更改迭代次數

$ sudo cryptsetup luksChangeKey --pbkdf-force-iterations 1000   /dev/nvme0n1p1
Enter passphrase to be changed: 
Enter new passphrase: 
Verify passphrase: 
$ sudo cryptsetup luksDump /dev/nvme0n1p1 
LUKS header information for /dev/nvme0n1p1

Version:        1
Cipher name:    aes
Cipher mode:    xts-plain64
Hash spec:      sha256
Payload offset: 4096
MK bits:        512
MK digest:      ec 22 27 de c1 ef 40 0f a5 cf 37 d3 96 5c d5 b2 6e c8 dd 90 
MK salt:        62 1a 05 81 ba 60 3b 0d b1 8a 9f f0 04 98 27 54 
               06 b6 8d 72 53 23 09 47 ea 5f 80 1d d7 c5 ca 50 
MK iterations:  305173
UUID:           586de9a0-14c7-40d7-b721-7fdba2e3b184

Key Slot 0: ENABLED
       Iterations:             4888466
       Salt:                   93 c2 c4 fe 95 ab 24 44 9e dd 26 90 c1 cf a2 66 
                               19 80 d3 4b f9 e8 b3 5a 0e a1 9f 6a de d8 60 ea 
       Key material offset:    8
       AF stripes:             4000
Key Slot 1: ENABLED
       Iterations:             4882774
       Salt:                   2a 22 d6 07 a3 48 ad 83 f9 f4 03 a4 a1 e7 95 ab 
                               2c 95 82 cf c1 73 99 1c 74 70 00 5b b8 1b bf 5f 
       Key material offset:    512
       AF stripes:             4000
Key Slot 2: ENABLED
       Iterations:             1000
       Salt:                   65 fe 32 1d c4 c6 1b 38 28 4c 19 3c c0 27 5a d9 
                               83 92 13 8e f4 84 61 00 b5 f6 6c f8 75 15 36 52 
       Key material offset:    1016
       AF stripes:             4000
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED

問題

  1. 更改迭代次數後,我們可以看到之前的鍵槽 0 被禁用,而不是被啟用。是隨機分配鍵槽嗎?那很重要嗎?
  2. 為了加快啟動速度,我是否需要將所有鍵槽的迭代次數減少到 1000?因為,我記得鍵槽是按順序檢查的。
  3. 如何將所有關鍵插槽的迭代次數設為 1000?
  4. 上述命令顯示的資訊是私有的,不應該共享嗎?

(1.) cryptsetup 出於內部原因交換密鑰槽,不幸的是你只需要處理它。

從 cryptsetup luksChangeKey 手冊頁:

如果指定了密鑰槽(通過 –key-slot),則必須給出該密鑰槽的密碼,並且新的密碼將覆蓋指定的密鑰槽。

如果未指定密鑰槽並且仍有空閒密鑰槽,則在清除包含舊密碼片語的密鑰槽之前,新密碼將被放入空閒密鑰槽。

如果沒有空閒的密鑰槽,則直接覆蓋帶有舊密碼的密鑰槽。

它還提到了它更喜歡隨機排列鍵槽的原因之一:

警告:如果鍵槽被覆蓋,則此操作期間的媒體故障可能會導致在擦除舊密碼後覆蓋失敗,並使 LUKS 容器無法訪問。

一些 cryptsetup 命令允許您指定要使用的密鑰槽,例如,您可以刪除特定槽或將新密鑰添加到特定空閒槽。因此,有多種方法可以按您想要的順序獲取密鑰。

(2.) 最好將您最常使用的鑰匙放在第一個插槽中。否則將首先嘗試慢速插槽。也可以在 cryptsetup 打開時指定所需的密鑰槽,但 GRUB 可能不支持它。

對於 LUKS 2,鍵也根本不按鍵槽順序進行嘗試。相反,它取決於儲存在 JSON 元數據中的順序,以及您可以設置的鍵槽優先級cryptsetup config --priority,但我不知道 GRUB 是否會尊重這一點。

(3.) 通過改變它們中的每一個,或以其他方式刪除有問題的。(考慮在刪除密鑰之前備份 LUKS 標頭,因為這樣可能會將自己鎖定。)

luksDump(4.)由於密鑰材料完全失去,因此無法從輸出中導出 LUKS 主密鑰或密碼。但是,如果您在某處失去了此驅動器,並且發現它的人用Google搜尋了 UUID,他們可能會找到您的文章並以這種方式辨識您……

引用自:https://unix.stackexchange.com/questions/723410