Как программно определить точный начальный байт и точный конечный байт заголовка LUKS на устройстве хранения блоков?
Я использую Linux Унифицированная настройка ключа (LUKS) для полного шифрования диска (FDE) Таким образом, все данные на моем диске зашифрованы с использованием надежного главного ключа, который не получен из моего пароля, и я работаю над сценарием, который будет безопасно очищать диск в ситуации паники / аварийного отключения (ie: кто-то физически крадет ваш ноутбук).
Допустим, у меня накопитель на 1000 т, и время в моем аварийном сценарии слишком короткое (~ 30 секунд), чтобы фактически заполнить диск случайными байтами. Вместо этого, я просто хотел бы перезаписать заголовок, потому что все данные на диске бесполезны, если заголовок (содержащий слоты ключей с главным ключом и солями) потерян - даже если пароль был восстановлен с помощью криптоанализа с резиновым шлангом .
Как программно безопасно определить начальный и конечный байты заголовка LUKS, чтобы я знал, что следует перезаписать?
Примечание: предоставленное решение должно быть действительным для LUKS1 (выпущено в 2014 году) и LUKS2 (выпущено в 2018 году).
В LUKS1 я обнаружил, что начало равно 0, и конец определяется путем умножения поля payload-offset
из двоичного заголовка контейнера на 512. Например,
root@disp4117:~# hexdump -Cs 6 -n 2 luksVol1
00000006 00 01 |..|
00000008
root@disp4117:~# hexdump -Cs 104 -n 4 luksVol1
00000068 00 00 10 00 |....|
0000006c
root@disp4117:~#
В этом случае заголовок LUKS1 заканчивается байтом 4096 * 512
= 2097152
.
В LUKS2 это намного сложнее, так как требует синтаксического анализа JSON объекта метаданных в заголовке LUKS.