龙蜥白皮书精选:基于 SM4 算法的文件加密(fscrypt)实践​

简介: 如何使用国密算法加密文件系统中的文件?

vcg_VCG41N1079013032_RF.jpg

文/张天佳


通常我们会以文件作为数据载体,使用磁盘,USB 闪存,SD 卡等存储介质进行数据存储,即便数据已经离线存储,仍然不能保证该存储介质不会丢失,如果丢失那么对于我们来说有可能是灾难性的事件。因此对这些离线存储的重要数据文件进行加密是非常有必要的,本节将介绍如何使用国密算法加密文件系统中的文件。

01 fscrypt 简介

内核中的 fscrypt 是一个库,文件系统可以使用它以支持文件和目录的透明加密。


与 dm-crypt 不同,fscrypt 在文件系统级别而不是块设备级别运行。这允许它使用不同的密钥加密不同的文件,并在同一文件系统上拥有未加密的文件。这对于多用户系统非常有用,在该系统中,每个用户的静态数据都需要与其他用户进行加密隔离。除了文件名,fscrypt 不加密文件系统的元数据。


与作为栈式文件系统的 eCryptfs 不同,fscrypt 是直接集成到支持的文件系统中,目前支持 fscrypt 的文件系统是 ext4、F2FS 和 UBIFS。fscrypt 允许读取和写入加密文件,而无需在页面缓存中同时缓存解密和加密页面,从而将使用的内存几乎减半并使其与未加密文件保持一致。同样,需要一半的 dentry 和 inode。eCryptfs 还将加密文件名限制为 143 字节,从而导致应用程序兼容性问题;fscrypt 允许完整的 255 个字节 (NAME_MAX)长度的文件名。最后,与 eCryptfs 不同,fscrypt API 可以由非特权用户使用,而无需依赖其它任何组件。


fscrypt 不支持就地加密文件。相反,它支持将空目录标记为已加密。然后,在用户空间提供密钥后,在该目录树中创建的所有常规文件、目录和符号链接都将被透明地加密。

02 支持的加密模式和用法

fscrypt 允许为文件内容指定一种加密模式,为文件名指定一种加密模式。不同的目录树允许使用不同的加密方式。目前支持以下几种加密方式对:

  • AES-256-XTS 算法用于加密内容,AES-256-CTS-CBC 算法用于加密文件名
  • AES-128-CBC 算法用于加密内容,AES-128-CTS-CBC 算法用于加密文件名
  • Adiantum 算法同时用于加密文件内容和文件名
  • AES-256-XTS 算法用于加密内容,AES-256-HCTR2 算法用于加密文件名(仅限 v2 策略)
  • SM4-XTS 算法用于加密内容,SM4-CTS-CBC 算法用于加密文件名(仅限 v2 策略)


AES-128-CBC 仅为具有不支持 XTS 模式的加速器的低功耗嵌入式设备使用。要使用 AES-128-CBC,必须启用 CONFIG_CRYPTO_ESSIV 和 CONFIG_CRYPTO_SHA256(或其他 SHA-256 实现)以便使用 ESSIV。


Adiantum 是一种基于流密码的模式,即使在没有专用加密指令的 CPU 上也很快。与 XTS 不同,它也是真正的宽块模式。要使用 Adiantum,必须启用 CONFIG_CRYPTO_ADIANTUM。此外,应启用 ChaCha 和 NHPoly1305 的快速实现,例如 ARM 架构上的 CONFIG_CRYPTO_CHACHA20_NEON 和 CONFIG_CRYPTO_NHPOLY1305_NEON。


AES-256-HCTR2 是另一种真正的宽块加密模式,旨在用于具有专用加密指令的 CPU。AES-256-HCTR2 具有明文中的位翻转会更改整个密文的属性。由于初始化向量在目录中重复使用,因此此属性使其成为文件名加密的理想选择。要使用 AES-256-HCTR2,必须启用 CONFIG_CRYPTO_HCTR2。此外,应启用 XCTR 和 POLYVAL 的快速实现,例如 用于 ARM64 的 CRYPTO_POLYVAL_ARM64_CE 和 CRYPTO_AES_ARM64_CE_BLK。


最后是 SM4 算法,目前仅在 fscrypt v2 策略中启用。

03 使用 SM4 算法加密文件

🟢 准备工作

fscrypt 依赖内核配置 CONFIG_FS_ENCRYPTION=y,这里操作系统选择使用 ANCK 5.10 内核的 Anolis OS,其次,需要支持 fscrypt 特性的文件系统,这里以 ext4 为例,当然,F2FS 或者 UBIFS 也可以。


用户空间是通过 fscrypt API 跟内核完成交互的,对于用户来说,一般是通过 fscryptctl 或者 fscrypt 工具来下达加密策略。


本节内容以 fscryptctl(https://github.com/google/fscryptctl) 工具为例来演示,目前这是一个第三方工具,需要手工安装,按如下常规流程安装:

git clone https://github.com/google/fscryptctl.git
cd fscryptctl
make
make install

其次,选择一块未用到的磁盘格式化为支持 fscrypt 的文件系统 ext4,并挂载。

mkfs.ext4 -O encrypt /dev/vda3
mount /dev/vda3 /mnt
🟢 透明加密文件

fscrypt 所用的加解密钥是关联在超级块上的,运行时是跟挂载点相关联的,添加删除密钥都是针对挂载点的操作,以下对密钥操作的命令都会带上挂载点。


按如下命令所示设置加密策略:

# 生成密钥文件,实际环境中应用使用更复杂的密钥
> echo '1234567812345678' > /tmp/keyfile
# 添加该密钥到文件系统,返回密钥ID,之后对密钥的操作都使用这个ID来索引
> fscryptctl add_key /mnt < /tmp/keyfile
23086a13ed81fd75ca5fe9b8f2ff25c7
# 查看密钥状态(不是必需)
> fscryptctl key_status 23086a13ed81fd75ca5fe9b8f2ff25c7 /mnt
Present (user_count=1, added_by_self)
# 创建加密目录 endir,并设置加密策略
# 使用之前添加的密钥和 SM4 算法来加密该目录中的文件和子目录
> mkdir /mnt/endir
> fscryptctl set_policy --contents=SM4-XTS \
        --filenames=SM4-CTS 23086a13ed81fd75ca5fe9b8f2ff25c7 /mnt/endir
# 查看策略是否生效(不是必需)
> fscryptctl get_policy /mnt/endir
Encryption policy for /mnt/endir:
    Policy version: 2
    Master key identifier: 23086a13ed81fd75ca5fe9b8f2ff25c7
    Contents encryption mode: SM4-XTS
    Filenames encryption mode: SM4-CTS
    Flags: PAD_32

此时,endir 已经是支持透明加解密的一个目录,可以像正常目录一样创建删除文件,在该目录下进行一些常规的文件操作,可以看到与普通目录没有区别:

> mkdir /mnt/endir/foo
> echo 'hello' > /mnt/endir/foo/hello
> cp -v /usr/include/curl/* endir
> tree /mnt/endir
/mnt/endir
├── curl.h
├── easy.h
├── foo
│   └── hello
└── websockets.h
🟢 锁定加密目录

之所以能像普通目录一样操作,是因为密钥已经被添加到了文件系统中。接下来删除密钥后,就能看到目录被锁定,里面的所有路径和内容都是加密状态:

# 移除密钥
> fscryptctl remove_key 23086a13ed81fd75ca5fe9b8f2ff25c7 /mnt
> fscryptctl key_status 23086a13ed81fd75ca5fe9b8f2ff25c7 /mnt
Absent
# 处于加密状态的目录树
> tree /mnt/endir
/mnt/endir
├── 1H2e0BbS4MGZKAKEu6NVXniaYMWIrWDwbyzX6EVEWEN8tfWcWNgDyw
├── LvYw6Jl0a1jImKKOFPjtpG3hEDxjjuM6YIYqcMeXaWdzKUdaX0YCNQ
├── QBBz8_qGE4MJY6YVzfqVUkr6YeCSqtoQmbvG04BsR0lAr2oLwO0b2g
│   └── wOYdFlMRACjeBa-eSo3LuO4sE55q1YuFv-S_lVU-n498jdMjAt06JA
└── zoiobWxVG2DLjg8uMXfsVP11159zqQUjozJ8gmt1zyjayJlZ4awOhA
# 目录被锁定,无法进行常规文件操作,即便拔盘,也不能得到明文内容
> cat /mnt/endir/1H2e0BbS4MGZKAKEu6NVXniaYMWIrWDwbyzX6EVEWEN8tfWcWNgDyw
cat: /mnt/endir/1H2e0BbS4MGZKAKEu6NVXniaYMWIrWDwbyzX6EVEWEN8tfWcWNgDyw: Required key not available
> mkdir /mnt/endir/hello
mkdir: cannot create directory ‘/mnt/endir/hello’: Required key not available
🟢 再次解锁加密目录

要解锁目录也很简单,重新添加密钥即可,文件系统会搜索到正确的密钥并解锁相应目录:

> fscryptctl add_key /mnt < /tmp/keyfile
23086a13ed81fd75ca5fe9b8f2ff25c7
# 添加密钥后文件内容可正常访问
> cat /mnt/endir/foo/hello
hello

04 后记

fscryptctl 是一个相对原生的工具,更接近内核,可以看到,该工具命令比较复杂,使用中需要记住很长一串密钥 ID,用户体验并不好。


实际环境中,一般会使用 fscrypt 工具来完成加密策略操作,该工具由 Google 开发,用 Go 语言写成,通过在用户层面维护了一些元数据来简化用户操作,命令更易于理解,也更接近用户。


商密软件栈 SIG 主页: https://openanolis.cn/sig/crypto


附:商用密码技术最佳实践白皮书:https://openanolis.cn/shangmi

—— 完 ——

加入龙蜥社群

加入微信群:添加社区助理-龙蜥社区小龙(微信:openanolis_assis),备注【龙蜥】与你同在;加入钉钉群:扫描下方钉钉群二维码。

640.png

相关文章
|
1月前
|
Kubernetes Devops 持续交付
DevOps实践:使用Docker和Kubernetes实现持续集成和部署网络安全的守护盾:加密技术与安全意识的重要性
【8月更文挑战第27天】本文将引导读者理解并应用DevOps的核心理念,通过Docker和Kubernetes的实战案例,深入探讨如何在现代软件开发中实现自动化的持续集成和部署。文章不仅提供理论知识,还结合真实示例,旨在帮助开发者提升效率,优化工作流程。
|
1月前
|
存储 安全 算法
揭秘网络安全的盾牌:漏洞防御与加密技术的实践
【8月更文挑战第27天】在数字化浪潮中,网络安全成了我们不可忽视的护身符。本文将深入探讨网络安全中的两大支柱——安全漏洞防护和加密技术,揭示它们如何成为保护信息安全的坚固盾牌。我们将从基础概念出发,逐步深入到实际应用,通过具体实例分析,展示这些技术如何在现实世界发挥作用。无论你是网络新手还是资深专家,这篇文章都将为你打开一扇了解和应用网络安全技术的大门。
36 6
|
30天前
|
算法 安全 数据安全/隐私保护
Android经典实战之常见的移动端加密算法和用kotlin进行AES-256加密和解密
本文介绍了移动端开发中常用的数据加密算法,包括对称加密(如 AES 和 DES)、非对称加密(如 RSA)、散列算法(如 SHA-256 和 MD5)及消息认证码(如 HMAC)。重点讲解了如何使用 Kotlin 实现 AES-256 的加密和解密,并提供了详细的代码示例。通过生成密钥、加密和解密数据等步骤,展示了如何在 Kotlin 项目中实现数据的安全加密。
57 1
|
30天前
|
算法 安全 数据安全/隐私保护
Android经典实战之常见的移动端加密算法和用kotlin进行AES-256加密和解密
本文介绍了移动端开发中常用的数据加密算法,包括对称加密(如 AES 和 DES)、非对称加密(如 RSA)、散列算法(如 SHA-256 和 MD5)及消息认证码(如 HMAC)。重点展示了如何使用 Kotlin 实现 AES-256 的加密和解密,提供了详细的代码示例。
33 2
|
1月前
|
算法 JavaScript 前端开发
国标非对称加密:RSA算法、非对称特征、js还原、jsencrypt和rsa模块解析
国标非对称加密:RSA算法、非对称特征、js还原、jsencrypt和rsa模块解析
118 1
|
1月前
|
算法 JavaScript 前端开发
消息摘要算法:MD5加密
消息摘要算法:MD5加密
46 1
|
1月前
|
机器学习/深度学习 SQL 安全
网络防线的构建者与破坏者:网络安全漏洞、加密技术与安全意识的探索之旅深度学习中的图像识别技术:从理论到实践
【8月更文挑战第27天】在数字时代的海洋中,我们都是航行者。网络安全是保护我们免受风暴侵袭的坚固船体,而信息安全则是指引我们航向正确方向的灯塔。本文将带领读者深入理解网络安全漏洞的形成机制,探索加密技术如何成为我们的盾牌,以及为何提升个人和组织的安全意识至关重要。通过深入浅出的方式,我们将一起学习如何加固这艘船,确保它能在风浪中稳健前行。
|
1月前
|
存储 安全 Linux
Linux存储安全:数据加密的实践与策略
【8月更文挑战第19天】数据加密是Linux存储安全的基石之一。通过使用LUKS进行磁盘加密和使用GnuPG进行文件加密,可以显著提高数据的安全性。
48 0
|
2月前
|
搜索推荐 安全 网络安全
AES 加密解密技术原理模式和实践
AES (Advanced Encryption Standard), aka Rijndael, is a symmetric encryption algorithm offering high security and speed over DES.
|
1月前
|
安全 Nacos 数据安全/隐私保护
【技术干货】破解Nacos安全隐患:连接用户名与密码明文传输!掌握HTTPS、JWT与OAuth2.0加密秘籍,打造坚不可摧的微服务注册与配置中心!从原理到实践,全方位解析如何构建安全防护体系,让您从此告别数据泄露风险!
【8月更文挑战第15天】Nacos是一款广受好评的微服务注册与配置中心,但其连接用户名和密码的明文传输成为安全隐患。本文探讨加密策略提升安全性。首先介绍明文传输风险,随后对比三种加密方案:HTTPS简化数据保护;JWT令牌减少凭证传输,适配分布式环境;OAuth2.0增强安全,支持多授权模式。每种方案各有千秋,开发者需根据具体需求选择最佳实践,确保服务安全稳定运行。
91 0