GaussDB(DWS) 数据库加解密
GaussDB(DWS) 数据库加密
在GaussDB(DWS) 中,用户可以选择为集群启用数据库加密,以保护静态数据。当集群启用加密时,该集群及其快照的数据都会得到加密处理。
用户可以在创建集群时启用加密。加密是集群的一项可选且不可变的设置。要从未加密的集群更改为加密集群(或反之),必须从现有集群导出数据,然后在已启用数据库加密的新集群中重新导入这些数据。数据库加密是在数据落盘时进行加密,即在往GaussDB(DWS) 写入数据时GaussDB(DWS) 会对数据进行加密,而在用户查询数据时GaussDB(DWS) 会将数据自动进行解密后再将结果返回给用户。
使用KMS服务加密GaussDB(DWS) 数据库
当选择KMS(密钥管理服务)对GaussDB(DWS)进行密钥管理时,加密密钥层次结构有三层。按层次结构顺序排列,这些密钥为主密钥(CMK)、集群加密密钥(CEK)、数据库加密密钥(DEK)。
主密钥用于给CEK加密,保存在KMS中。
CEK用于加密DEK,CEK明文保存在GaussDB(DWS)集群内存中,密文保存在GaussDB(DWS)服务中。
DEK用于加密数据库中的数据,DEK明文保存在GaussDB(DWS)集群内存中,密文保存在GaussDB(DWS)服务中。
密钥使用流程如下:
1.用户选择主密钥。
2.GaussDB(DWS) 随机生成CEK和DEK明文。
3.KMS使用用户所选的主密钥加密CEK明文并将加密后的CEK密文导入到GaussDB(DWS)服务中。
4.GaussDB(DWS) 使用CEK明文加密DEK明文并将加密后的DEK密文保存到GaussDB(DWS)服务中。
5.GaussDB(DWS)将DEK明文传递到集群中并加载到集群内存中。
当该集群重启时,集群会自动通过API向GaussDB(DWS)请求DEK明文,GaussDB(DWS)将CEK、DEK密文加载到集群内存中,再调用KMS使用主密钥CMK来解密CEK,并加载到集群内存中,最后用CEK明文解密DEK,并加载到集群内存中,返回给集群。
加密密钥轮转
加密密钥轮转是指更新保存在GaussDB(DWS)服务的密文。在GaussDB(DWS)中,可以轮转已加密集群的加密密钥CEK。
密钥轮转流程如下:
1.GaussDB(DWS)集群启动密钥轮转。
2.GaussDB(DWS)根据集群的主密钥来解密保存在GaussDB(DWS) 服务中的CEK密文,获取CEK明文。
3.用获取到的CEK明文解密保存在GaussDB(DWS)服务中的DEK密文,获取DEK明文。
4.GaussDB(DWS)重新生成新的CEK明文。
5.GaussDB(DWS)用新的CEK明文加密DEK并将DEK密文保存在GaussDB(DWS) 服务中。
6.用主密钥加密新的CEK明文并将CEK密文保存在GaussDB(DWS)服务中。
用户可以根据业务需求和数据类型计划轮转加密密钥的时间。为了提高数据的安全性,建议用户定期执行轮转密钥以避免密钥被破解的风险。一旦发现密钥可能已泄露,请及时轮转密钥。
GaussDB(DWS) 数据加解密函数
GaussDB(DWS)主要提供了哈希函数和对称密码算法来实现对数据列的加解密。哈希函数支持sha256,sha384,sha512和国密sm3。对称密码算法支持aes128,aes192,aes256和国密sm4。
哈希函数
哈希函数又称为摘要算法,对于数据data,Hash函数会生成固定长度的数据,即Hash(data)=result。这个过程是不可逆的,即Hash函数不存在反函数,无法由result得到data。在不应保存明文场景(比如口令password属于敏感信息),系统管理员用户也不应该知道用户的密码,就应该使用哈希算法存储口令的单向哈希值。
实际使用中会加入盐值和迭代次数,避免相同口令生成相同的哈希值,以防止彩虹表攻击。
对称密码算法
对称密码算法使用相同的密钥来加密和解密数据。对称密码算法分为分组密码算法和流密码算法。
分组密码算法将明文分成固定长度的分组,用密钥对每个分组加密。由于分组长度固定,当明文长度不是分组长度的整数倍时,会对明文做填充处理。由于填充的存在,分组密码算法得到的密文长度会大于明文长度。
流加密算法是指加密和解密双方使用相同伪随机加密数据流作为密钥,明文数据依次与密钥数据流顺次对应加密,得到密文数据流。实践中数据通常是一个位(bit)并用异或(xor)操作加密。流密码算法不需要填充,得到的密文长度等于明文长度。