数据加密存储方案
概述
数据加密实现方式诸多,基本可以概括为三类:
- 应用层加解密。应用向数据库提交加密后数据
- 数据库前置代理加解密。应用向数据库前置代理提交明文数据,代理加密后存入数据库
- 磁盘存取环节解密。在数据库存储引擎与文件系统间的读写环节进行加解密
加密技术 | 部署位置 | 防硬盘丢失 | 防 DBA | 查询复杂度 | 特点 |
---|---|---|---|---|---|
应用层加密 | 应用服务器 | ✅ | ✅ | ⚠️影响 | 灵活性高,但应用的调用逻辑需要改造 |
代理层加密 | 数据库前置代理 | ✅ | ⚠️ | ⚠️影响 | 应用层无感知,网关高性能、高可用及工程实现难度较大,实际上阻挡不了拥有网关连接信息的 DBA |
磁盘存取加密 | 数据库服务器 | ✅ | ❌ | ✅不影响 | 部署简单,应用层无感知 |
实际上
- 上述 应用层加密 和 代理层加密 本质上都算应用层加密,只是部署环节不同而已
- 几种加密方式都能保证所存文件为加密数据,都可以保障硬盘被窃取情况下的数据安全
- 加密方式的选型需要结合需结合实际业务场景进行评估,做到在保证合规的前提性,尽可能避免增加开发成本与维护难度
关键点考量
应用层加密 or 存储层加密?
- 虽然存储层加密可以让应用层无需任何改造,但当下我司相关数据较为敏感,需确保包括 DBA 在内的角色均不可直接访问;于是主要考虑在应用层进行数据加密
- 应用层加解密的一个劣势在于:被加密数据不能利用到索引,多数时候只能全表查询。结合当前业务的数据量,以及敏感信息查询需求而言,此性能劣势可忽略
应用程序中加密 or 代理层加密?
- 加解密逻辑安放在应用层还是代理层?
- 安放在代理层的优势在于减轻应用改造的工作量,理想情况下应用层无需任何改造
- 代理层加解密的劣势在于其本身的开发维护成本高,且不如应用层灵活
- (当前并没有集中管理的数据库服务,数据库由应用负责人自建),由于各技术负责人不同,相关加密需求各有差异,试图通过数据库前置代理层解决加密需求的投入产出比将大幅降低,成本甚至高于应用层直接加密
- 基于当前业务状态以及基础设施成熟度,应用程序中加密的方式是最佳选择
应用层加密
- 如上文所述,受制于当前的基础设施状况,对于应用层加密,通过提供一个解决方案指引 + 辅助服务到各业务负责人,是比开发加密代理服务更合适的选项
- 提供一个密钥托管服务作为加密的辅助服务
- 对于典型开发语言,可提供相应 SDK 以便快速集成
加密/解密过程简介
- 加密算法使用 AES-256-CBC,做到相同明文不同密文
- 密文格式:
密钥序列号.初始向量.密文正文
- 初始化: 程序启动时,向密钥服务器请求其名下密钥集合,密钥的关键内容包含(序列号、密钥正文)
- 数据加密:根据需要将
明文内容
+密钥正文
+密钥序列号
传递到加密函数中,得到加密后的密文,使用密文替代原本的明文内容进行数据写入 - 数据解密:从数据库中得到密文后,在程序中通过序列号得到其密钥,将
密文
、密钥
、初始向量
传递到解密函数中,即可得到解密后的明文
密钥托管服务
- 提供一个网站用于开发者自助申请密钥
- 开发者在网页上提交申请可以得到密钥序列号,不能得到密文
- 应用程序中通过 API 的方式向密钥服务获得对应密钥用于加解密
密钥废弃操作
- 应用开发者可持有多个密钥,因此废弃旧密钥的操作可平稳进行