Linux文件加密,目录机密,磁盘加密
在 Linux 上让 “打开文件需要输入密码”,核心是对文件 / 目录做加密,只有输入正确密码才能解密查看。下面按 “单文件”“目录 / 批量文件”“磁盘 / 容器” 三种场景,来演示下如何加密
一、单文件加密
适合单个文档、脚本、配置等,打开 / 编辑必须输密码
1、Vim 内置加密(最简单,仅文本)
用 Vim 直接给文件加密码,仅用 Vim 打开时提示密码,其他工具打开是乱码
vim -x secret.txt #新文件或者已有文件都用此方式加密,会提示输入两次密码
加密后只有通过vim 打开文件输入密码后才能查看,通过cat打开也是乱码,如图:

- 打开时:
vim secret.txt→ 提示输入密码,正确才显示明文 - 取消加密:正确打开后,
:X→ 密码留空,保存即可 - 缺点:算法较弱,不适合极高安全需求;仅文本文件
2、GPG 加密(通用、安全,推荐)
几乎所有发行版自带,支持任何文件类型,加密后生成 .gpg 文件,解密需密码
- 优点:安全、跨平台、支持大文件;任何文件都能用
- 缺点:需手动解密,不能 “双击直接打开
# 安装(如未预装)
sudo apt install gnupg # Debian/Ubuntu
sudo dnf install gnupg # RHEL/CentOS/Fedora
# 加密文件(对称加密,用密码)
gpg -c myfile.pdf # 会提示输入两次密码,生成 myfile.pdf.gpg
# 解密/打开(自动提示输密码)
gpg -d myfile.pdf.gpg > myfile.pdf # 输出到新文件
# 或直接解密覆盖原文件(谨慎)
gpg myfile.pdf.gpg
注:GPG 代理会缓存密码一段时间(默认 10 分钟到 2 小时),因此如果刚加密再解密不会提示输入密码,可执行命令清除缓存,然后在解密就提示输入密码了,如下:
gpgconf --kill gpg-agent
gpg-connect-agent reloadagent /bye
3、OpenSSL 加密(轻量、命令行友好)
用 AES-256 等强算法加密,适合脚本自动化
# 加密
openssl enc -aes-256-cbc -salt -in secret.txt -out secret.txt.enc
# 解密
openssl enc -d -aes-256-cbc -in secret.txt.enc -out secret.txt
二、对目录下的文件内容和文件名加密
eCryptfs(Enterprise Cryptographic Filesystem)是 Linux 内核内置的企业级、堆叠式文件级加密系统(自 2.6.19 内核起支持)。其核心功能是对指定目录下的文件内容与文件名进行透明加密,无需修改应用即可保护数据,即便设备丢失或被非法访问,未授权者也无法读取密文
核心功能讲解:
1、透明加密 / 解密(最核心)
- 内核级堆叠:叠加在 ext4、XFS 等底层文件系统之上,不占用独立分区。
- 无感使用:授权用户读写时自动解密 / 加密,应用程序完全无感知。
- 文件粒度:每个文件独立加密,互不影响。
2. 双重加密:内容 + 文件名
- 文件内容加密
- 每个文件生成唯一随机 FEK(文件加密密钥)。
- 用 AES-256 等强对称算法加密文件数据。
- FEK 再被用户密码 / 密钥加密(EFEK),存在文件头部。
- 文件名加密
- 支持加密目录与文件名,彻底隐藏敏感信息。
- 加密后文件名变长(约 1/3)。
3. 灵活密钥体系
- 密码 / 密钥派生:从用户密码生成主密钥(FEKEK)。
- 多级密钥:
- FEK:文件数据加密(随机生成)。
- FEKEK:加密保护 FEK(用户密码 / 公钥)。
- 内核密钥环:密钥安全缓存,会话期免重复输密码。
- 扩展支持:TPM、PKCS#11、公钥加密(RSA)。
4. 便捷部署与迁移
- 目录级加密:挂载到任意目录(如~/Private)。
- 无需预分配空间:直接在现有目录启用。
- 可迁移备份:加密文件 + 头部元数据,可直接复制 / 备份 / 恢复。
- 用户 Home 加密:Ubuntu 等曾用它实现加密主目录。
5. 安全与兼容特性
- 内核 Crypto API:高效、内核态加解密,性能损耗低。
- OpenPGP 兼容格式:安全标准高、可跨信任域迁移ecryptfs.sourceforge.net。
- POSIX 兼容:保留权限、属主、软硬链接等属性。
- 不影响交换分区:需配合 dm-crypt 单独加密 swap
适用场景:
- 个人 / 企业 敏感目录加密(文档、证书、代码)
- 多用户服务器 用户 Home 隔离加密
- 云服务器 / VPS 数据防泄露
- 移动设备 丢失后数据保护
- 需 文件级、可迁移、透明加密 的场景(非全盘)
eCryptfs使用
1、先安装包,如下:
sudo apt update && sudo apt install ecryptfs-utils
2、建两个目录(明文挂载点 + 底层加密存储)
# 上层:你日常用的解密目录,实际的业务文件是在这个目录下
mkdir -p ~/Private_Decrypt
# 下层:真正存加密文件的目录(千万别直接往这里写!)
mkdir -p /opt/ecryptfs_my_secret
chmod 700 /opt/ecryptfs_my_secret
3、执行命令挂载(加密目录在前,明文目录在后)
mount -t ecryptfs /opt/ecryptfs_my_secret ~/Private_Decrypt
- Passphrase: 输入你强密码(记住!丢了数据全没)
- Select cipher: 选
aes - Select key bytes: 选
32(AES-256) - Enable plaintext passthrough:
n(选n 表示传递来的文件全部加密) - Enable filename encryption:
y(文件名也加密)
注:挂载成功后:往 ~/Private_Decrypt 写文件,自动加密;底层 /opt/ecryptfs_my_secret 全是乱码密文。
4、验证下,想~/Private_Decrypt中创建文件写入内容,然后查看/opt/ecryptfs_my_secret中的文件,如图:


5、卸载加密目录
退出所有该目录程序,再执行:
umount ~/Private_Decrypt
卸载后,~/Private_Decrypt 看不到真实内容(是空的,没有任何内容),必须重新输密码挂载才行
6、日常运维关键操作:
查看当前 eCryptfs 挂载:
mount | grep ecryptfs
忘记挂载参数,重新交互式挂载:
mount -t ecryptfs 底层目录 挂载点
备份加密数据,只备份底层加密目录就行,/opt/ecryptfs_my_secret 整个打包复制,换机器也能挂载解密(只要密码一致),不要直接备份解密目录!那是明文
开机自动挂载(慎用,存密码有风险)
7、常见报错 & 坑
Input/output error 打不开文件:
- 没正确卸载就拔盘 / 重启,加密元数据损坏
- 解决:先 umount,检查底层目录权限 700,重新挂载核对密码、文件名加密开关一致
挂载提示参数不匹配:
- 前后:AES、32 位密钥、文件名加密
y/n必须和第一次完全一致
Docker / 容器里用报错:
- eCryptfs 叠加文件系统,容器直通挂载容易权限 /inode 冲突;不建议把 eCryptfs 目录直接给 Docker 做数据卷,优先 LUKS 块加密更稳
总结下ecryptfs主要能干啥:把一个加密目录挂载到一个明文目录中,然后在明文目录中写入数据,如果我卸载了加密目录,那么明文直接就看不到了,应用挂掉,如果想继续重新使用,可以重新挂载,只有知道了密码才能重新挂载,否则数据全部丢失
三、对整个磁盘加密
LUKS = Linux Unified Key Setup,主要功能是给整个磁盘/分区进行加密
核心作用:
1、加密整个分区 / 磁盘(块级加密):
- /dev/sda3 整个系统盘,整个移动硬盘、U 盘、整个数据分区(写入的所有数据(系统、文件、日志、缓存、临时文件、swap 交换分区)全部自动加密,内核底层加解密,上层系统完全无感)
2、开机 / 挂载必须输密码 / 插密钥
- 没密码 → 分区直接识别不了,全盘都是乱码;
- 丢硬盘、被盗、拆盘读数据 → 完全扒不出来
3、支持多密码槽(非常实用),一个 LUKS 加密盘,可以存多个解锁密码 / 密钥:
- 日常自己用主密码
- 留一个备用应急密码
- 用 U 盘密钥文件解锁
4、系统级全覆盖
- 包括临时文件、缓存、swap 虚拟内存、残留日志 ——全部加密不留明文痕迹,这是 eCryptfs 做不到的
LUKS vs eCryptfs 直白对比
| 对比项 | LUKS(dm-crypt) | eCryptfs |
|---|---|---|
| 加密层级 | 整块磁盘 / 分区(块级) | 文件夹 / 文件(文件级) |
| 要不要独立分区 | 必须单独分区 / 整块盘 | 随便一个目录就行 |
| 加密范围 | 所有数据、日志、缓存、swap 全覆盖 | 只保护你指定的那个目录 |
| 删除文件 | 彻底密文删除,无残留 | 删明文视图 = 删真实加密文件 |
| 迁移拷贝 | 整个分区镜像迁移,不能单拷文件 | 可单独拷贝单个加密文件 / 目录 |
| 适合场景 | 装机全盘加密、服务器整盘保密、移动硬盘加密 | 只加密个别隐私文件夹、证书、私密文档 |
| Docker / 容器 | 稳定兼容,生产首选 | 容易出 IO 报错、不推荐容器用 |
LUKS 是块级加密,依赖:cryptsetup + dm-crypt
⚠️ 警告:所有操作会清空目标磁盘 / 分区数据!先备份!分清设备,别炸系统盘!
实际操作
1、安装工具,如下:
apt update && sudo apt install cryptsetup
2、给Linux服务器新增一块盘,并将此盘进行分区,先不用执行mkfs来格式化,如图:

3、给分区初始化 LUKS 加密(写加密头),给分区写入 LUKS 头部、生成加密密钥槽,整个分区变成密文容器,如下:
cryptsetup luksFormat /dev/vdb1
- 输入大写
YES确认(必须全大写) - 设置强解锁密码(牢记,丢了数据永久报废)

4、打开 LUKS 容器,映射成系统可识别虚拟设备,如下:
cryptsetup luksOpen /dev/vdb1 mycrypt
mycrypt:自定义映射名,然后输入刚才设置的密码

执行后会生成虚拟块设备,执行fdisk -l 可以查看,如图:

5、在加密容器里建文件系统,格式化为xfs,如下:
mkfs.xfs /dev/mapper/mycrypt

6、挂载使用,如下:
mkdir -p /datanew
mount /dev/mapper/mycrypt /datanew
现在往/datanew中存文件 → 底层自动全盘加密,拆盘、读裸分区全是乱码
7、日常卸载 & 关闭加密(安全拔盘)
卸载:
umount /datanew
关闭 LUKS 映射,关闭后:/dev/mapper/mycrypt 消失,分区彻底锁死
cryptsetup luksClose mycrypt #要先退出/datanew目录,否则会提示Device mycrypt is still in use
下次重新使用方法:
# 1.打开加密
sudo cryptsetup luksOpen /dev/vdb1 mycrypt
# 2.挂载
sudo mount /dev/mapper/mycrypt /mnt/luks_data
8、进阶
查看 LUKS 信息 / 密钥槽
cryptsetup luksDump /dev/vdb1
添加新的备用密码,后续用备用密码挂载也可以的:
# 1. 添加新密码
sudo cryptsetup luksAddKey /dev/sdb1
# 2. 系统提示:输入【已存在的正确密码】
Enter any existing passphrase: 【输入你原来的主密码】
# 3. 系统提示:输入【新的备用密码】
Enter new passphrase for key slot: 【你想加的备用密码】
# 4. 确认新密码
Verify passphrase: 【再输一遍】
删除不用密码槽:
cryptsetup luksRemoveKey /dev/sdb1


