概述

数据加密实现方式诸多,基本可以概括为三类:

  1. 应用层加解密。应用向数据库提交加密后数据
  2. 数据库前置代理加解密。应用向数据库前置代理提交明文数据,代理加密后存入数据库
  3. 磁盘存取环节解密。在数据库存储引擎与文件系统间的读写环节进行加解密
加密技术 部署位置 防硬盘丢失 防 DBA 查询复杂度 特点
应用层加密 应用服务器 ⚠️影响 灵活性高,但应用的调用逻辑需要改造
代理层加密 数据库前置代理 ⚠️ ⚠️影响 应用层无感知,网关高性能、高可用及工程实现难度较大,实际上阻挡不了拥有网关连接信息的 DBA
磁盘存取加密 数据库服务器 ✅不影响 部署简单,应用层无感知

实际上

  1. 上述 应用层加密代理层加密 本质上都算应用层加密,只是部署环节不同而已
  2. 几种加密方式都能保证所存文件为加密数据,都可以保障硬盘被窃取情况下的数据安全
  3. 加密方式的选型需要结合需结合实际业务场景进行评估,做到在保证合规的前提性,尽可能避免增加开发成本与维护难度

关键点考量

应用层加密 or 存储层加密?

  1. 虽然存储层加密可以让应用层无需任何改造,但当下我司相关数据较为敏感,需确保包括 DBA 在内的角色均不可直接访问;于是主要考虑在应用层进行数据加密
  2. 应用层加解密的一个劣势在于:被加密数据不能利用到索引,多数时候只能全表查询。结合当前业务的数据量,以及敏感信息查询需求而言,此性能劣势可忽略

应用程序中加密 or 代理层加密?

  1. 加解密逻辑安放在应用层还是代理层?
  2. 安放在代理层的优势在于减轻应用改造的工作量,理想情况下应用层无需任何改造
  3. 代理层加解密的劣势在于其本身的开发维护成本高,且不如应用层灵活
  4. (当前并没有集中管理的数据库服务,数据库由应用负责人自建),由于各技术负责人不同,相关加密需求各有差异,试图通过数据库前置代理层解决加密需求的投入产出比将大幅降低,成本甚至高于应用层直接加密
  5. 基于当前业务状态以及基础设施成熟度,应用程序中加密的方式是最佳选择

应用层加密

  1. 如上文所述,受制于当前的基础设施状况,对于应用层加密,通过提供一个解决方案指引 + 辅助服务到各业务负责人,是比开发加密代理服务更合适的选项
  2. 提供一个密钥托管服务作为加密的辅助服务
  3. 对于典型开发语言,可提供相应 SDK 以便快速集成

加密/解密过程简介

  • 加密算法使用 AES-256-CBC,做到相同明文不同密文
  • 密文格式: 密钥序列号.初始向量.密文正文
  • 初始化: 程序启动时,向密钥服务器请求其名下密钥集合,密钥的关键内容包含(序列号、密钥正文)
  • 数据加密:根据需要将 明文内容 + 密钥正文 + 密钥序列号 传递到加密函数中,得到加密后的密文,使用密文替代原本的明文内容进行数据写入
  • 数据解密:从数据库中得到密文后,在程序中通过序列号得到其密钥,将 密文密钥初始向量 传递到解密函数中,即可得到解密后的明文

密钥托管服务

  • 提供一个网站用于开发者自助申请密钥
  • 开发者在网页上提交申请可以得到密钥序列号,不能得到密文
  • 应用程序中通过 API 的方式向密钥服务获得对应密钥用于加解密

密钥废弃操作

  • 应用开发者可持有多个密钥,因此废弃旧密钥的操作可平稳进行

相关文档