透明数据加密(简称 TDE)可以对存储在磁盘的上的敏感数据(包括基线数据和clog)进行加密。数据在写入存储设备前自动进行加密,读取时自动解密,该过程对用户是透明的,经过数据库认证的用户可以不受限制地访问数据。当存储介质被盗时,透明数据加密可以保证存储在介质上的敏感数据无法被未经认证的用户访问。
两级密钥体系
透明数据加密使用两级密钥体系实现加解密功能。开启加密的最小粒度为数据库中的一个表,需要开启加密的表需要放到一个加密的表空间(tablespace)中。每个加密的表空间设置有加密算法及对应的数据密钥,用于给表空间中的数据进行加密。每个租户有一个主密钥,用于对表空间密钥进行加密,为了防止未经授权的解密操作,通常将主密钥存储在外部密钥管理服务(简称 KMS)中。
开启加密时,使用主密钥对数据密钥进行加密后得到加密的数据密钥密文,该密文会存储在内部表、宏块头部、clog 头部中,数据密钥不会明文存储在任何地方。需要加解密数据时,使用主密钥解密该密文后得到数据密钥,从而对宏块或 clog 中的用户数据进行加解密操作。
加密生效机制
用户存储在磁盘上的数据包括了 clog 和宏块两类,只有在将数据实际写到磁盘上时加密才会生效,内存中的数据是不加密的。若将原本不加密的表改为加密后,原先已经存储在磁盘上的未加密的 clog 和宏块数据不会变为加密,后续新写到磁盘上的数据才是加密的。由于每一条 clog 和每一个宏块都会记录加密元信息,因此加密和未加密的数据可以同时存在。
clog 是采用追加写的方式写到磁盘上的,因此旧的未加密的 clog 永远不会变为加密。等开启加密一段时间,旧的 clog 都被回收后,磁盘上的 clog 数据就会都成为加密数据了。对于宏块数据,只有在转储或合并时才会发生写入,可以手动触发全量合并将未加密的宏块数据重写为加密的。
支持的加密算法
算法 | 密钥长度 | 模式 |
---|---|---|
AES | 128 bits 192 bits 256 bits | ecb |
SM4 | 128 bits | cbc |