数据库数据加密的 4 种常见思路的对比

20/Mar/2022 · 1 minute read

最近由于工作需要,我对欧洲的通用数据保护条例做了调研和学习,其中有非常重要的一点,也是常识性的一条,就是需要对用户的个人隐私数据做好加密存储,避免用户隐私明文数据泄露。

方案分析

思考如何对用户隐私数据做好加密处理,可以先从分析典型的数据读写链路开始:

    _________          query           _________           read           _________
    |       |     ---------------->    |       |     ---------------->    |       |
    |  应用  |                          |  DB   |                          | Disk  |
    |       |     <================    |       |     <================    |       |
    ---------           rows           ---------         data page        ---------

按照此链路分析,可以按照数据加密的着手点,划分数据加密的 4 类解决方案:

下面就这几类方案展开分析。

应用层加解密方案

采用这种方案的话,数据加解密对数据库无感知,由应用在存入数据前完成加密,在读取数据后完成解密。这种方案的优点是:

当时,缺点也非常明显:

在应用层实现加解密方案的话,实现上可以考虑结合各类 orm 的回调函数机制,如 golang 中流行的 ORM 框架 gorm 所提供的 Callbacks 机制,又或者是 Ruby on Rails 框架中 Active Record 的 Callbacks 机制,这些机制都能有效帮助我们将业务代码和控制代码进行相互隔离。

数据库前置处理方案

采用数据库前置处理方案,算是对应用层加解密方案的优化,本质思想是将加解密的关注点独立,从应用内部完全抽离,独立服务,同时实现加解密逻辑的复用性。

使用数据库前置处理,能够集成应用层加密方案的一些优点,同时解决了后者存在的一些问题:

  1. 灵活性:数据库代理同样具备较好的灵活性,可以实现列级的加解密;
  2. 复用性较好:多个应用或者系统不再需要重复建设,使用独立维护服务的数据库代理,能够实现快速的加解密功能的接入;
  3. 较高的透明度:应用开发人员无需在自身内部关注加解密逻辑,但是由于数据库代理的 SQL 兼容性下降,应用开发过程中不得不保持对 SQL 兼容性的理解。

数据库前置处理方案也有自身的一些缺陷:

  1. 稳定性下降,加大运维负担:因为整体架构引入了额外的服务节点,会给整体的服务成本以及问题排障场景增加负担,在遇到数据处理问题时,需要卷入数据库代理服务的维护人员一起排查故障;
  2. 无法利用数据库高级特性:和应用层数据加解密方案类似,此方案下,由于数据加密后经由数据库存储和索引,在查询场景中,涉及范围类型的数据检索都会导致扫表;
  3. 一致性问题:由于需要在数据库代理中维护业务数据表/或列的元信息,引入了代理层的配置信息和业务数据库设计的一致性问题。

磁盘存取环节:透明数据加密

目前各家云服务厂商基本都提供了这个方案的服务,简称透明数据加密(TDE)。这个方案的实现原理比较巧妙,它工作于操作系统层面,作用于数据库数据文件,通过 i/o 的钩子进程,在数据库存储引擎读写数据到文件系统的时候嵌入加解密逻辑,在写入数据前完成加密,而在数据读取后要返回给存储引擎进程之前执行解密,而整个过程对数据库存储引擎是完全透明的。

这个方案的优点诱人得多:

当然,没有完美的方案,这个方案存在一定限制:

在我自己的业务系统的设计方案中,我们引入了用户隐私域的概念,在设计上会将用户隐私数据和业务流程数据分离,天然实现用户隐私数据的集中存储,于是全表数据加密对我们是最合适的选择。

DB 后置处理

DB 后置处理是基于数据库的触发器和自定义函数功能等,在数据库服务器执行查询过程中触发自定义加解密逻辑的执行。这种方案可以说是解决了前面几个方案存在问题:

尽管这个方案看起来也很美,但是它依然不完美:

汇总对比

说了这么多,对比下几套方案的差异:

方案序号加密所在环节方案简介方案案例优点限制
1应用由应用在存储前自行加密,在检索后自行解密orm+各类钩子实现灵活/粒度细/兼容性强无法对应用透明,增加开发负担/额外的秘钥管理负担
2数据库前置代理在应用和数据库之间加入一层代理服务,由代理服务负责加解密腾讯云 CASB对应用高程度透明,无开发负担/支持列级别加密SQL 语法兼容性下降,对开发不是完全透明/数据库的优化处理、事务处理、并发处理等特性都无法使用/引入额外的环节,性能以及潜在排障负担/数据膨胀厉害,~4.5倍空间膨胀
3数据库数据文件工作在文件系统层面,引擎持久化存储前完成加密,数据文件加载到内存中前解密,内存中保留明文数据腾讯云透明数据加密(TDE)对应用完全透明/云数据库内置支持,兼容数据库高级特性表空间加密,不支持字段级别加密/无法规避 SQL 注入带来的拖库风险
4数据库后置处理使用“视图”+“触发器”+“扩展索引”+“外部调用”的方式实现数据加密,同时保证应用完全透明。对应用完全透明/数据库高级特性兼容性/支持列级别加密需要较强运维,没有云原生支持

几种方案共存的问题

前面分析中始终没有去讨论的问题,是不管哪种方案都无法绕开的问题:

总结

数据存储安全是一个越来越重要,也是应用系统设计阶段必须提前考虑好的问题,因为它涉及的是服务质量和成本平衡的复杂问题。数据加密在业务合规以及隐私保护中正在逐步扮演常识性的地位,如同大家如今都知道密码不能明文存储一样,未来各类个人隐私数据加密也应该会成为系统中的标配设计。