从5.7.11开始,mysql开始支持物理表空间的加密,它使用两层加密架构。
包括:master key 和 tablespace key

master key用于加密tablespace key,加密后的结果存储在tablespace的header中。tablespace key用于加密数据
当用户想访问加密的表时,innoDB会先用master key对之前存储在header中的加密信息进行解密,得到tablespace key。再用tablespace key解密数据信息。tablespace key是不会被改变的(除非进行alter table t1 encrytion=NO, alter table t1 encrytion=YES)。而master key可以随时改变(ALTER INSTANCE ROTATE INNODB MASTER KEY;)

InnoDB表空间加密依赖于keyring插件。总共有四个插件

keyring插件 开始版本 类型
keyring_file  5.7.11 社区版
keyring_encrypted_file  5.7.21 企业版
keyring_okv  5.7.12 企业版
keyring_aws  5.7.19 企业版

由于上面四种类型的加密后三种都只有在企业版本有,所以接下来的介绍主要以社区版本的keyring_file为例进行说明。

安装:

1.配置文件中加入如下参数:
[mysqld]
early-plugin-load=keyring_file.so
keyring_file_data=/usr/local/mysql/mysql-keyring/keyring

2.查看所加插件是否生效:
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'keyring%';
+--------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+--------------+---------------+
| keyring_file | ACTIVE |
+--------------+---------------+

3.查看 innodb_file_per_table参数是否已经为开(default:ON)

4.创建加密表空间
CREATE TABLE t1 (c1 INT) ENCRYPTION='Y';
ALTER TABLE t1 ENCRYPTION='Y';

5.取消加密表空间:
ALTER TABLE t1 ENCRYPTION='N';

master key需周期性地改变,增强安全性,master key rotation是原子的、实例级别的操作。轮换时,所有的tablespace key都会被重新用新master key加密并存储到相关的tablespace header中。
更换master key只会改变master key和重新加密tablespace key,不会解密及重加密表空间数据。
更换语句:ALTER INSTANCE ROTATE INNODB MASTER KEY;
更换时,能够进行并发地DML操作,但是不能和CREATE TABLE ... ENCRYPTED 或 ALTER TABLE ... ENCRYPTED 并行。

当在进行master key 更换时,实例挂掉。那在实例重启时会继续此操作。
在重启过程中,keyring插件将优先于innoDB初始化执行,因为innoDB需要keyring插件来解密相关的数据,这也是为什么需要用early-plugin-load参数的原因(用--plugin-load 或 --plugin-load-add 加载的插件是在InnoDB初始化后才加载的。用 INSTALL PLUGIN加载的插件是注册在mysql.plugin表中,但它也是一个innodb表,里面注册的插件也是在innodb初始化后才执行的)。同时,mysql会去扫描所有的加密表空间文件。对于依旧使用旧master key的文件,innodb会先用old master key来解密tablespace key,再用new master key加密tablespace key后重写回tablespace header中。

当导出一个加密的表时,InnoDB生成一个transfer key用来加密tablespace key,加密的tablespace key及transfer key存储在tablespace_name.cfp文件中。当导入时,InnoDB会使用transfer key来解密tablespace key。

执行ALTER INSTANCE ROTATE INNODB MASTER KEY时,主从实例必须都得支持表空间加密才行
ALTER INSTANCE ROTATE INNODB MASTER KEY执行成功后会被记录在binlog中。

找出加密的表空间:
SELECT TABLE_SCHEMA, TABLE_NAME, CREATE_OPTIONS FROM INFORMATION_SCHEMA.TABLES WHERE CREATE_OPTIONS LIKE '%ENCRYPTION="Y"%';
+--------------+------------+----------------+
| TABLE_SCHEMA | TABLE_NAME | CREATE_OPTIONS |
+--------------+------------+----------------+
| test | t1 | ENCRYPTION="Y" |
+--------------+------------+----------------+

注意:
1.不能一次使用多个加密插件。
2.确保master key的安全性,如果丢失,就会造成数据文件的不可用。在初次建立表空间加密及master key rotation时,建议备份
3.ALTER TABLE ... ENCRYPTION 操作用 ALGORITHM=COPY重建表,不支持ALGORITHM=INPLACE
4.如果实例退出,建立用同样的加密配置启动实例。
5.第一个新的或存在的表加密时,会自动生成master key
6.轮换Master key时只是重新加密tablespace key,并没有改变tablespace key,要改变tablespace key,需要用 ALTER TABLE tbl_name ENCRYPTION先禁用加密再重新加密,它使用ALGORITHM=COPY来重建表。
7.如果一个表创建时使用compression及encryption选项,compression会在encryption前执行。
8.如果keyring 数据文件(keyring_file_data变量)是空的或不存在,第一次执行 ALTER INSTANCE ROTATE INNODB MASTER KEY 会生成master key.
9.卸载keyring_file 插件时并不会删除keyring 数据文件。
10.不建议把keyring数据文件和tablespace表放在同一个目录中。
11.在运行或重启时修改 keyring_file_data 变量会使之前加密的表不可访问,造成数据丢失。

限制:
1.AES是唯一支持的加密算法。在InnodB表空间中,tablespace key使用Electronic Codebook (ECB)块加密模式,data使用Cipher Block Chaining (CBC)块加密模式.
2.改变一个有的ENCRYPTION属性使用的是ALGORITHM=COPY,不支持ALGORITHM=INPLACE
3.只支持加密存储在file-per-table的表,general tablespaces, system tablespace, undo log tablespaces,temporary tablespace不支持加密。
4.不能把一个加密的表空间移到一个不支持的表空间类型。
5.表空间加密只加密表空间中的数据,在redo log,undo log,binary log中的数据是不加密的。
6.已经被加密的表不允许修改成其它存储引擎。

mysql表空间加密 keyring encryption的更多相关文章

  1. MySQL InnoDB表空间加密

    从 MySQL5.7.11开始,MySQL对InnoDB支持存储在单独表空间中的表的数据加密 .此功能为物理表空间数据文件提供静态加密.该加密是在引擎内部数据页级别的加密手段,在数据页写入文件系统时加 ...

  2. MySQL5.7表空间加密

    MySQL5.7开始支持表空间加密了,增强了MySQL的数据文件的安全性,这是一个很不错的一个功能,这个特性默认是没有启用的,要使用这个功能要安装插件keyring_file. 下面就来看看怎么安装, ...

  3. KingbaseES 表空间加密-透明加密

    透明存储加密是指数据在写到磁盘上时对其进行加密,当授权用户重新读取数据时再对其进行解密.加密解密过程对用户都是透明的,无需对应用程序进行修改,授权用户甚至不会注意到数据已经在存储介质上加密.当前的透明 ...

  4. MySQL表空间集

    --MySQL表空间集 ----------------------2014-09-20 1. 收缩ibdata的方法,目前MySQL依然没有提供收缩ibdata的方法,只能重构,下面是5.7的步骤. ...

  5. 10. InnoDB表空间加密

    10. InnoDB表空间加密 InnoDB支持存储在单独表空间中的表的数据加密 .此功能为物理表空间数据文件提供静态加密. 详细信息见官方文档

  6. mysql 表空间

    开启了Innodb的innodb_file_per_table这个参数之后[innodb_file_per_table = 1],也就是启用InnoDB的独立表空间模式,便于管理.此时,在新建的inn ...

  7. MySQL 表空间传输

    聊到MySQL数据迁移的话题,表空间传输时一个很实用的方法. 在MySQL 5.6 Oracle引入了一个可移动表空间的特征(复制的表空间到另一个服务器)和Percona Server采用部分备份,这 ...

  8. 详解MySQL表空间以及ibdata1文件过大问题

    ibdata1文件过大 原因分析 ibdata1是一个用来构建innodb系统表空间的文件,关于系统表空间详细介绍参考MySQL官网文档 上面是一个数据库的ibdata1文件,达到了780多G,而且还 ...

  9. innodb和myisam数据库文件存储详解以及mysql表空间

    数据库常用的两种引擎有Innodb和Myisam,关于二者的区别参考:https://www.cnblogs.com/qlqwjy/p/7965460.html 1.关于数据库的存储在两种引擎的存储是 ...

随机推荐

  1. 【DWM1000】 code 解密4一 ANCHOR 二进宫testapprun_s

    上面我们的代码分析到ANCHOR 调用了一次testapprun_s,但是后面退出后发现还是满足while 条件,逼不得已还得再次调用testapprun_s.testapprun_s 也就是这样一点 ...

  2. CY7C68013 USB接口相机开发记录 - 第四天:上位机编写1

    前面学习了USB相机硬件固件.设备驱动,可以实现USB设备识别.数据发送的功能.然后,非常重要的一部分,USB设备发出的数据,我要怎么接受,怎么查看发送的数据是否是正确的.网上百度了下,大部分人都使用 ...

  3. [P2704][NOI2001]炮兵阵地 (状态压缩)

    最近抄状压的代码…… 然后盯上了这个题目 调试了一个晚上,终于A了 但是是对着宝典打的,我依然不懂状态压缩 那么下一步先把装压放一放,学一下树形DP吧 #include<cstdio> # ...

  4. Coins [POJ1742] [DP]

      Description 给出硬币面额及每种硬币的个数,求从1到m能凑出面额的个数. Input 多组数据,每组数据前两个数字为n,m.n表示硬币种类数,m为最大面额,之后前n个数为每种硬币的面额, ...

  5. Python内置GUI模块Tkinter的几点笔记

    组件属性,用法 组件位置 更多

  6. Android requestcode resultcode的作用

    requestcode 一个页面的不同事件,激发不同的函数,startActivityForResult中传入不同的请求码的值以调用下一个界面,在被调用界面结束返回第一个界面时,请求码会自动返回(自动 ...

  7. Java基础知识--内存管理

    Java语言中 的垃圾收集器相对于以前的其他语言优势是什么? 过去的语言需要程序员显示的进行分配内存.释放内存.这种做法可能会引起“内存泄漏”,即由于某种原因是分配给程序的内存无法释放,如果该任务不断 ...

  8. 180400之pycharm快捷方式汇总

    1.Pycharm中快捷键大全,遇到一个更新一个 撤销与反撤销:Ctrl + z,Ctrl + Shift + z 缩进.不缩进:Tab.Shift + tab 运行:Shift + F10 批量注释 ...

  9. 【原】通过AOP实现MyBatis多数据源的动态切换

    [环境参数]1.开发框架:Spring + SpringMVC + MyBatis 2.数据库A的URL:jdbc.url=jdbc:mysql://172.16.17.164:3306/ test? ...

  10. ES6项目构建(babel+gulp+webpack)

    (一)基础架构 (二)任务自动化(gulp) (三)编译工具(babel,webpack) (四)代码实现 一.基础构架 1.app : 放置前端代码 css : css文件 js : js文件 cl ...