1 什么是国密/商密 加密
国家于 2020 年施行密码法、2021 年施行个人信息保护法,对个人隐私数据和数据安全加密有更高的要求。
国密算法是指由中国国家密码管理局发布的密码算法标准,旨在保障国家信息安全。目前,国家密码管理局已发布了一系列国产商用密码标准算法,包括SM1(SCB2)、SM2、SM3、SM4、SM7、SM9以及祖冲之密码算法(ZUC)
等。
通过在金融、电子政务及安防等领域广泛应用国密算法,在对敏感数据进行机密性、完整性和可用性保护的同时,减少对外部密码产品的依赖,提升国家信息安全水平。
[🐵 判断是否符合我国商用密码技术合规要求]
密码产品需要通过 中国国家密码管理局 商用密码检测中心 的检测才会发放认证证书,认为此商用密码产品符合规则要求。例如阿里铜锁产品证书。
2 实现思想
MySQL本身支持物理表空间的加密,使用两层加密架构。包括:主密钥(master key) 和 表空间密钥(tablespace key)。
主密钥用于加密表空间密钥,加密后的表空间密钥存储在表空间文件的header中。表空间密钥用于加密数据。当用户想访问加密的表时,innoDB会先用 主密钥 对之前存储在表空间header中被加密的表空间密钥进行解密,得到明文的表空间密钥,再用表空间密钥解密数据信息。
表空间密钥是不会改变的,而主密钥可以通过命令随时改变。表空间加密功能由innodb和keyring插件共同实现。innodb负责使用表空间密钥加/解密表内数据,keyring负责管理主密钥。
MySQL加密的最底层选用的加密工具依赖于SSL,默认的加密使用工具是OPENSLL中提供的密钥(随机数)生成接口。
对于主密钥(master key)和表空间密钥(tablespace key)来说最后的密钥生成都依赖底层SSL库对外提供的函数接口。GreatSQL在这里使用铜锁提供的国密加密算法接口。
⛳️铜锁的加密思想是:通过安装铜锁到操作系统后,其就能够在原来openssl的基础上,添加支持国密的加密算法,并且提供相关的密钥管理功能,这样就能够釜底抽薪的实现国密算法支持。
2.1 如何选择国密加密的?
通过添加编译选项 -DWITH_SSL_GM=ON将SM4_X加入到定义与使用中。就可以选择国密。并且之后也不能再使用MySQL默认的AES aes_256_cbc 加密算法,只能是sm4_x。
2.2 国密加密的系统结构是如何的?
总体结构是怎么样的?
比较关键的就是四个点:
1.是从客户端到innodb层,操作类型包括轮转/生成主密钥、创建表时根据选项进项表空间加密、插入数据时进行加密等动作。
2.是innodb内部的一一系列操作,包括生成主密钥、创建表空间及加密、数据加密等动作。
3.是从服务的角度,向innodb层提供加密的操作,例如生成密钥、获取密钥、加密数据等操作。还有插件注册到服务中,然后通过innodb调用服务,之后使用插件中的方法。
4.是innodb在写undolog、logflush时,具体的将数据写入到磁盘中。
master key更新需要执行“ALTER INSTANCE ROTATE INNODB MASTER KEY;”,表示旋转主密钥。
旋转主密钥的时候,也会进my_aes,主要就是用于,当要更换当前的master key后,同时也更新用于加密的元数据信息,也就是更新表空间加密所用的元数据信息(用于加密之后生成表的数据)。
从加密的角度来说,具体的加密数据是在innodb层调用了mysys层中的my_aes_openssl.cc中的my_aes_encrypt函数进行加密,这个函数里面基于master key生成表空间密钥,也将源数据使用加密算法进行加密。
总的来说,在总体加密流程上,GreatSQl并没有对原始的MySQL做出太大的改动,而是使用开源的、通过商业认证的铜锁加密软件,实现表空间的数据加密。表空间加密支持国密算法,只是通过原始的Openssl + 铜锁 提供的接口函数+宏定义实现的。以上的整个流程,其实就是MySQL的加密流程。