什么是 LUKS —— Linux 磁盘加密标准
一、LUKS 是什么
LUKS(Linux Unified Key Setup)是 Linux 下块设备(磁盘/分区)加密的事实标准,通过 cryptsetup 工具管理。
简单说:LUKS 对整块分区或磁盘进行透明加密,挂载后使用和普通磁盘无异,但底层数据是密文,拔走硬盘无法直接读取。
┌─────────────────────────────────┐
│ 应用层(App) │ ← 读写文件和普通磁盘一样
├─────────────────────────────────┤
│ VFS / 文件系统 │
├─────────────────────────────────┤
│ dm-crypt(内核映射层) │ ← 透明加解密,内核完成
├─────────────────────────────────┤
│ LUKS Header → 实际块设备 │ ← 磁盘上存的是密文
└─────────────────────────────────┘
LUKS 只是一个标准格式规范,实际加解密由内核模块
dm-crypt执行,管理工具是cryptsetup。
二、核心概念
2.1 LUKS Header(头部)
每个 LUKS 加密分区的开头有一个 LUKS Header,存储:
| 内容 | 说明 |
|---|---|
| 魔数 | LUKS\xba\xbe,识别 LUKS 格式 |
| 版本 | LUKS1 或 LUKS2 |
| 加密算法 | AES、Serpent、Twofish 等 |
| 密钥槽(Key Slot) | 最多 8 个独立密码位置 |
| 主密钥(Master Key)密文 | 每个槽存储一份用槽密码加密的主密钥副本 |
2.2 主密钥 vs 用户密码
用户密码(Passphrase)
│
└──→ [PBKDF2/Argon2 密钥派生] → 槽密钥
│
└──→ 解密主密钥(Master Key)← 存在 LUKS Header
│
└──→ 真正加密/解密磁盘数据
| 对比 | 用户密码 | 主密钥(Master Key) |
|---|---|---|
| 谁设置的 | 用户 | cryptsetup luksFormat 随机生成 |
| 能否修改 | ✅ luksChangeKey |
❌ 修改需要全盘重新加密 |
| 长度 | 用户定义 | 通常是 256/512 位随机数 |
| 用途 | 解锁密钥槽 | 真正加密数据的密钥 |
关键设计:修改用户密码不需要重新加密全盘,因为只改密钥槽里的主密钥密文,主密钥本身不变。
2.3 密钥槽(Key Slots)
LUKS 支持最多 8 个密钥槽,每个槽独立解密主密钥:
LUKS Header
├── Key Slot 0: 主密钥密文(用员工A的密码加密)
├── Key Slot 1: 主密钥密文(用员工B的密码加密)
├── ...
└── Key Slot 7: 主密钥密文
实际用途:
- 管理员和用户各持一个密码
- 设置一个恢复密码(万一忘记主密码)
- 离职只需删除对应槽,不影响其他人
三、LUKS1 vs LUKS2
| 对比 | LUKS1 | LUKS2 |
|---|---|---|
| 发布年份 | 2004 | 2017 |
| Header 大小 | 固定 2MB | 灵活,默认 16MB |
| 密钥派生算法 | 仅 PBKDF2 | Argon2(抗 GPU/ASIC 破解) |
| 完整性校验 | 无 | ✅ 防止篡改攻击 |
| 元数据格式 | 二进制 | JSON,可扩展 |
| 支持持久化标识 | ❌ | ✅ token、label 等 |
| 内核要求 | 全部支持 | 需要 4.12+ |
| 当前推荐 | 遗留兼容 | 默认推荐 ✅ |
现在用
cryptsetup luksFormat默认创建的就是 LUKS2。
五、LUKS 加密层的内核实现
5.1 dm-crypt 与 device-mapper
用户写入 /mnt/
│
▼
文件系统 (ext4/xfs)
│
▼
/dev/mapper/mysecret ← dm-crypt 虚拟块设备
│ │
│ ├── 加密写入数据
│ └── 解密读取数据
▼
/dev/sdb1 ← 物理设备,存储的是密文
LUKS 是”格式标准”,dm-crypt 是”加密引擎”,device-mapper 是”目标映射框架”。三者关系:
cryptsetup(用户工具)
│
├── luksFormat:写入 LUKS Header 到磁盘
│
└── luksOpen:配置 dm-crypt 目标
│
└── dmsetup create mysecret --table "0 <size> crypt aes-xts-plain64 <key> 0 /dev/sdb1 0"
│
└── 创建 /dev/mapper/mysecret
六、LUKS 在实际产品中的应用
6.1 嵌入式设备数据分区加密
Rockchip / Android / Ubuntu 设备
├── boot 分区:不加密(需要启动)
├── rootfs:可选加密(initramfs 解锁)
└── userdata:LUKS 加密
└── 存储用户数据、日志、配置文件
七、安全注意事项
| 注意点 | 说明 |
|---|---|
| LUKS Header 备份 | cryptsetup luksHeaderBackup 备份头部,Header 损坏 = 数据完全丢失 |
| 忘记密码 | 没有后门!删完所有密钥槽则数据永久不可恢复 |
| 主密钥泄露 | 更换密码不更新主密钥,若担心主密钥泄露需 reencrypt 全盘重加密 |
| 冷启动攻击 | 内存中的密钥在关机后短暂残留,物理接触攻击面 |
| 性能影响 | CPU 有 AES-NI 指令集时加密开销极小(< 5%),软件实现约 10~30% |
八、与其他加密方案对比
| 方案 | 层级 | 特点 |
|---|---|---|
| LUKS + dm-crypt | 块设备层 | 整盘透明加密,对上层文件系统/应用无感知 |
| fscrypt | 文件系统层 | 按目录加密(Android 用此方案) |
| eCryptfs | 文件系统层 | 按文件加密(旧 Ubuntu Home 加密方案) |
| f2fs 原生加密 | 文件系统层 | f2fs 内置,Android 数据分区常用 |
| 自加密硬盘 SED | 硬件层 | 主控内完成,不消耗 CPU |
留下评论