Das Linux Unified Key Setup bzw. kurz LUKS ist eine Spezifikation für die Festplattenverschlüsselung, die von Clemens Frühwirth 2004 für Linux zur Verschlüsselung ganzer Partitionen entwickelt wurde. LUKS beschreibt das Format der Verschlüsselung auf dem Volume und ist grundsätzlich plattformunabhängig.
Unter Linux ist cryptsetup das zentrale Dienstprogramm zur Verwaltung von LUKS-Volumes.
Zur Vermeidung von Wörterbuchangriffen implementiert LUKS PBKDF2, das zum von RSA Security entwickelten Standard PKCS #5 gehört.
Eine mit LUKS verschlüsselte Festplattenpartition besitzt folgenden Header (Mehrbytewerte sind dabei im Big-Endian-Format abgespeichert, Klartext-Bezeichner sind dabei mit Nullbytes aufgefüllt, wenn sie kürzer als der vorgesehene Speicherplatz sind):
| Offset | Datentyp | Inhalt | |
|---|---|---|---|
| 0 | 0hex | char[6] | Magische Zahl {'L', 'U', 'K', 'S', 0xBA, 0xBE } |
| 6 | 6hex | uint16_t | LUKS-Version (bei LUKS1 0x0001) |
| 8 | 8hex | char[32] | Name des Chiffrieralgorithmus (z. B. "twofish" oder "aes") |
| 40 | 28hex | char[32] | Name des Chiffriermodus (z. B. "cbc-essiv:sha256") |
| 72 | 48hex | char[32] | Name der Hashfunktion (z. B. "sha1" oder "ripemd160") |
| 104 | 68hex | uint32_t | Offset zu den Daten (in Sektoren) |
| 108 | 6Chex | uint32_t | Anzahl der Schlüsselbytes |
| 112 | 70hex | char[20] | Prüfsumme des PBKDF2-Masterschlüssels |
| 132 | 84hex | char[32] | Salt des PBKDF2-Masterschlüssels |
| 164 | A4hex | uint32_t | Anzahl der PBKDF2-Iterationen (Default: 10) |
| 168 | A8hex | char[40] | UUID der Partition (im üblichen Hex-Format, z. B. "504c9fa7-d080-4acf-a829-73227b48fb89") |
| 208 | D0hex | (48 Bytes) | Keyslot 1 (siehe unten) |
| … | |||
| 544 | 220hex | (48 Bytes) | Keyslot 8 (siehe unten) |
| 592 Bytes total | |||
Jeder der acht Keyslots besitzt dabei folgendes Format:
| Offset | Datentyp | Inhalt |
|---|---|---|
| 0 | uint32_t | Status: Aktiv=0x00AC71F3; Inaktiv=0x0000DEAD |
| 4 | uint32_t | Anzahl der Iterationen für PBKDF2 |
| 8 | char[32] | Salt für PBKDF2 |
| 40 | uint32_t | Startsektor für Schlüsseldaten |
| 44 | uint32_t | Anzahl der Anti-Forensic-Stripes (Default: 4000) |
| 48 Bytes total | ||
Seit Linux-Kernel-Version 4.12 gibt es eine neue LUKS-Version, die einige neue Funktionen bietet: