JuiceFS|JuiceFS 数据加密原理
JuiceFS 作为分布文件系统,每天与海量的数据打着交道,因此数据的安全性尤为关键,今天就来介绍一下 JuiceFS 在数据加密方面所做的努力。
传输中数据加密
JuiceFS 在网络上传输时会对数据进行加密,以防止未经授权的用户窃听网络通信。
JuiceFS 客户端始终使用 HTTPS 把数据上传到对象存储服务,以下情况除外:
- 使用内部端点上传至阿里云 OSS
- 使用内部端点上传至 UCloud US3
JuiceFS 在客户端加密中采用了行业标准的加密方式(AES-GCM 和 RSA)。加密和解密是在 JuiceFS 客户端进行的。用户唯一需要做的是在 JuiceFS 挂载时提供一个私人密钥或密码,并像普通文件系统一样使用它。它对应用程序是完全透明的。
注意:在客户端缓存的数据是不加密的。不过,只有 root 用户或所有者可以访问这些数据。如果要把缓存的数据也加密,你可以把缓存目录放在一个加密的文件系统或块存储中。加密和解密方法 必须为每个加密的文件系统创建一个全局 RSA 密钥
M
。在对象存储中保存的每个对象都将有自己的随机对称密钥 S
。数据用对称密钥 S
进行 AES-GCM 加密,S
用全局 RSA 密钥 M
进行加密,RSA 密钥使用用户指定的口令进行加密。文章图片
【JuiceFS|JuiceFS 数据加密原理】数据加密的详细过程如下:
- 在写入对象存储之前,数据块会使用 LZ4 或 ZStandard 进行压缩。
- 为每个块生成一个随机的 256 位对称密钥
S
和一个随机种子N
。 - 基于 AES-GCM 使用
S
和N
对每个块进行加密。 - 使用 RSA 密钥
M
对对称密钥S
进行加密得到密文K
。 - 将加密后的数据、密文
K
和随机种子N
组合成对象,然后写入对象存储。
- 读取整个加密对象(它可能比 4MB 大一点)。
- 解析对象数据得到密文
K
、随机种子N
和被加密的数据。 - 用 RSA 密钥解密
K
,得到对称密钥S
。 - 基于 AES-GCM 使用
S
和N
解密数据得到数据块明文。 - 对数据块解压缩。
当使用
juicefs format
创建一个新卷时,可以通过 --encrypt-rsa-key
参数指定 RSA 私钥来启用静态加密,该私钥将会被保存到 Redis。当私钥被密码保护时,可以使用环境变量 JFS_RSA_PASSPHRASE
来指定密码。使用方法:
生成 RSA 密钥
$ openssl genrsa -out my-priv-key.pem -aes256 2048
在格式化时提供该密钥
$ juicefs format --encrypt-rsa-key my-priv-key.pem META-URL NAME
注意:如果私钥受密码保护,在执行性能 TLS、HTTPS 和 AES-256 在现代 CPU 中的实现非常高效。因此,启用加密功能对文件系统的性能影响并不大。RSA 算法相对较慢,特别是解密过程。建议在存储加密中使用 2048 位 RSA 密钥。使用 4096 位密钥可能会对读取性能产生重大影响。juicefs mount
时应使用JFS_RSA_PASSPHRASE
来指定该密码。
总结 文件系统加密技术几乎可以适用于任何基于文件系统的数据库存储加密需求,本文从原理出发到实际操作如何生成并使用密钥,详细介绍了 JuiceFS 对数据加密解密的过程 。未来,JuiceFS 将持续努力为您的数据安全保驾护航。
推荐阅读:知乎 x JuiceFS:利用 JuiceFS 给 Flink 容器启动加速
如有帮助的话欢迎关注我们项目 Juicedata/JuiceFS 哟! (0?0?)
推荐阅读
- Docker应用:容器间通信与Mariadb数据库主从复制
- 对称加密和非对称加密的区别
- Android中的AES加密-下
- 使用协程爬取网页,计算网页数据大小
- Java|Java基础——数组
- Python数据分析(一)(Matplotlib使用)
- Jsr303做前端数据校验
- Spark|Spark 数据倾斜及其解决方案
- 数据库设计与优化
- 爬虫数据处理HTML转义字符