FBE文件加密
简述
本文将介绍基于 Linux Kernel 的 file-level encryption 实现的 X5 FBE 功能。
X5-FBE 和 FDE 类似,在使用者写数据时将数据自动的加密并且存储到 eMMC 中,在用户读数据时又可以自动的将数据从 eMMC 中读出并且解密呈现给使用者。使用者全程不需要去刻意的调用加密算法。
不同的是 FDE 是基于磁盘加密,它只能对某个分区进行保护,而 FBE 可以做到对任意一个文件夹中的内容进行保护。而且 FBE 可以在运行态下选择对某个文件进行加解密。可以看出 FBE 比 FDE 更加灵活。
| 缩写 | 全称 |
|---|---|
| FBE | File base encryption |
X5-FBE使用方法
X5-FBE 在 Kernel 层基于 fscrypt,代码所在路径为
kernel/fs/crypto
Kernel 中要确保下面的配置已经打开,配置文件位于 kernel/arch/arm64/configs,地瓜 X5-evb 已经打开
CONFIG_FS_ENCRYPTION=y
在用户层基于开源工具fscryptctl,V1.0.0
这个工具通过 buildroot 集成到 X5 rootfs 中,烧录镜像后即可使用:
root@buildroot:~# fscryptctl -v
v1.0.0
地瓜 X5 平台支持使用派生密钥作为 FBE 的 key,派生密钥由 user root key 派生,usr root key 的说明可以看FDE
确保目标分区已经开encryp功能
比如下面的实验我们都是在 /userdata 下执行,那么就要确保/userdata所在分区已经打开encrypt功能:
root@buildroot:~# tune2fs -O encrypt /dev/block/platform/by-name/userdata
tune2fs 1.46.5 (30-Dec-2021)
root@buildroot:~# tune2fs -l /dev/block/platform/by-name/userdata | grep -i "Filesystem features"
Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent 64bit flex_bg encrypt sparse_super large_file huge_file dir_nlink extra_isize metadata_csum
FBE 默认使用 Kernel 提供的基于 CPU 的加解密算法
fscryptctl 中对于文件名加密使用的默认算法是 AES-256-CTS,对应文件内容加密使用的默认算法是 AES-256-XTS ,要在 Kernel 中确保这两种算法使能
CONFIG_CRYPTO_CTS=y
CONFIG_CRYPTO_XTS=y
基于外部密钥
#初始化FBE
tune2fs -O encrypt /dev/block/platform/by-name/userdata
#生成密钥
dd if=/dev/random of=/userdata/keyfile bs=1 count=32
mkdir -p /userdata/fbe
cd /userdata/fbe/
#将密钥应用到文件夹
fscryptctl add_key . < /userdata/keyfile > /userdata/keyid
#设置文件夹策略
fscryptctl set_policy $(cat /userdata/keyid) .
echo "test" > test.txt;
cat test.txt
#删除对应密钥
fscryptctl remove_key $(cat /userdata/keyid) .
cat test.txt
基于X5派生密钥
#初始化FBE
tune2fs -O encrypt /dev/block/platform/by-name/userdata
mkdir -p /userdata/fbe
cd /userdata/fbe/
#将密钥应用到文件夹
getdmkey --km | xxd -r -p | fscryptctl add_key . > /userdata/keyid
#设置文件夹策略
fscryptctl set_policy $(cat /userdata/keyid) .
echo "test" > test.txt;
cat test.txt
#删除对应密钥
fscryptctl remove_key $(cat /userdata/keyid) .
cat test.txt