对 MySQL 表强制实施透明加密 (TDE)(Windows 版)

更新页 :
页面创建日期 :

操作环境

MySQL的
  • MySQL 8.0 社区版
窗户
  • 视窗 11

先决条件

MySQL的
  • MySQL 8.0 社区版
  • MySQL 8.0 企业版
窗户
  • 视窗 11
  • 视窗 10
Windows 服务器
  • Windows 服务器 2022
  • Windows Server 2019
  • Windows 服务器 2016
  • Windows 服务器 2012 R2

前提

  • 已安装MySQL数据库。

关于透明加密

顾名思义,企业透明数据加密是一种加密技术,它比任何没有加密技术的东西都更安全。 通常,在加密时,它通常是实现者的负担,因为需要执行加密和解密处理。 这个名称“透明”的含义是,它可以在不对过程进行任何更改的情况下进行加密。 因此,如果在开始时对设置进行一些更改,其余的将在未经许可的情况下进行加密,因此这是一种非常有效的安全措施。

但是,正如“无需更改任何内容”这句话所暗示的那样,如果您实际登录数据库,则可以正常查看数据,并且如果从程序中获取数据库记录,则可以正常查看数据。 如果获取的数据是加密的,则需要更改流程,因此与“无需更改流程”的措辞不符。

然后,在MySQL中,究竟什么是透明加密是加密的,“存储的数据库文件”或“表文件”都要加密。 正如我们稍后将检查的那样,即使您直接打开文件,它也只会对其进行加密,因此您无法看到内容,因此有必要对其进行操作,使其在实际操作中不会登录数据库。

正常创建表格并检查内容

首先,让我们创建一个表并正常记录。 您可以根据需要创建它,但在本例中,我们将通过在 Workbench 中执行 SQL 来创建它。 在这种情况下,我们计划为表设置透明加密,因此我们将正常创建数据库。

CREATE DATABASE `test_database`

桌子也是正常制作的。 列的内容可以是任何内容。

CREATE TABLE `plain_user` (
  `id` int NOT NULL,
  `name` varchar(32) ,
  `age` int ,
  `address` varchar(256) ,
  `phone` varchar(32) ,
  `email` varchar(128) ,
  `remarks` varchar(1024) ,
  `height` decimal(5, 2) ,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

我还将随机输入记录来检查加密。

INSERT INTO `test_database`.`plain_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('1','名前1','11','宮城県仙台市1','000-0000-0001','example1@example.com','備考1','170.00');
INSERT INTO `test_database`.`plain_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('2','名前2','12','宮城県仙台市2','000-0000-0002','example2@example.com','備考2','171.01');
INSERT INTO `test_database`.`plain_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('3','名前3','13','宮城県仙台市3','000-0000-0003','example3@example.com','備考3','172.02');
INSERT INTO `test_database`.`plain_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('4','名前4','14','宮城県仙台市4','000-0000-0004','example4@example.com','備考4','173.03');
INSERT INTO `test_database`.`plain_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('5','名前5','15','宮城県仙台市5','000-0000-0005','example5@example.com','備考5','174.04');
INSERT INTO `test_database`.`plain_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('6','名前6','16','宮城県仙台市6','000-0000-0006','example6@example.com','備考6','175.05');
INSERT INTO `test_database`.`plain_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('7','名前7','17','宮城県仙台市7','000-0000-0007','example7@example.com','備考7','176.06');
INSERT INTO `test_database`.`plain_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('8','名前8','18','宮城県仙台市8','000-0000-0008','example8@example.com','備考8','177.07');
INSERT INTO `test_database`.`plain_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('9','名前9','19','宮城県仙台市9','000-0000-0009','example9@example.com','備考9','178.08');
INSERT INTO `test_database`.`plain_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('10','名前10','20','宮城県仙台市10','000-0000-0010','example10@example.com','備考10','179.09');

创建数据库或表时,默认情况下会在以下文件夹中创建该数据库或表。

  • C:\ProgramData\MySQL\MySQL Server 8.0\Data

ProgramData 该文件夹处于隐藏状态,因此请在资源管理器设置中使其可见。

有一个文件夹,其中包含您在该文件夹中创建的数据库的名称,因此请打开它。

里面有一个逐个表的文件。

在文本编辑器(如记事本)中打开此文件。 由于它是一个二进制文件,我认为基本上有一行我不太理解的文本。 如果您查看底部,您将看到注册记录的文本。

如果不以这种方式加密,即使直接打开文件,也会知道记录的内容。 您无需登录数据库即可知道里面的内容。

配置透明加密设置

要启用透明加密,您需要安装插件。 首先,检查该插件是否包含在命令中。

通过从“开始”菜单中选择“MySQL 8.0 命令行客户端”来启动它。

输入密码并登录后,输入以下命令:

SELECT PLUGIN_NAME,PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'keyring%';

由于您尚未安装它,因此它应该是空的。

现在,让我们设置插件。 首先,创建以下文件夹: 事实上,你在哪里创建它或它是什么名字并不重要。 将其指定为以后要保存密钥文件的位置。

  • C:\ProgramData\MySQL\mysql-密钥环

接下来,在文本编辑器中打开以下文件:

  • C:\ProgramData\MySQL\MySQL Server 8.0\my.ini

将以下文本添加到底部的空白处并保存。 如果无法使用管理员权限进行存储,则可以将其保存到其他位置,然后覆盖该文件。

early-plugin-load=keyring_file.dll
keyring_file_data=C:\ProgramData\MySQL\mysql-keyring\keyring

重新启动MySQL服务。 您也可以使用命令重新启动它。

重新启动时,将在指定的文件夹中自动创建该文件。

您可以通过再次运行 check plug-in 命令来验证插件是否已安装。

SELECT PLUGIN_NAME,PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'keyring%';

创建加密表

现在,让我们创建一个加密表。 创建一个类似于上一个表的表,但这次添加到 ENCRYPTION='Y' 选项中。 目前在 GUI 中似乎无法进行此加密设置,因此必须使用命令进行设置。

CREATE TABLE `encrypt_user` (
  `id` int NOT NULL,
  `name` varchar(32) ,
  `age` int ,
  `address` varchar(256) ,
  `phone` varchar(32) ,
  `email` varchar(128) ,
  `remarks` varchar(1024) ,
  `height` decimal(5, 2) ,
PRIMARY KEY (`id`)
) ENCRYPTION='Y' ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

顺便说一句,在配置插件之前,即使尝试创建加密表,也会显示以下错误。

Can't find master key from keyring, please check in the server log if a keyring is loaded and initialized successfully.
キーリングからマスターキーが見つかりません。キーリングが正常にロードされ、初期化されているかどうかをサーバーログで確認してください。

如果你没有任何数据,你不知道它是否被加密,所以我会尝试放置相同的数据。

INSERT INTO `test_database`.`encrypt_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('1','名前1','11','宮城県仙台市1','000-0000-0001','example1@example.com','備考1','170.00');
INSERT INTO `test_database`.`encrypt_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('2','名前2','12','宮城県仙台市2','000-0000-0002','example2@example.com','備考2','171.01');
INSERT INTO `test_database`.`encrypt_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('3','名前3','13','宮城県仙台市3','000-0000-0003','example3@example.com','備考3','172.02');
INSERT INTO `test_database`.`encrypt_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('4','名前4','14','宮城県仙台市4','000-0000-0004','example4@example.com','備考4','173.03');
INSERT INTO `test_database`.`encrypt_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('5','名前5','15','宮城県仙台市5','000-0000-0005','example5@example.com','備考5','174.04');
INSERT INTO `test_database`.`encrypt_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('6','名前6','16','宮城県仙台市6','000-0000-0006','example6@example.com','備考6','175.05');
INSERT INTO `test_database`.`encrypt_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('7','名前7','17','宮城県仙台市7','000-0000-0007','example7@example.com','備考7','176.06');
INSERT INTO `test_database`.`encrypt_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('8','名前8','18','宮城県仙台市8','000-0000-0008','example8@example.com','備考8','177.07');
INSERT INTO `test_database`.`encrypt_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('9','名前9','19','宮城県仙台市9','000-0000-0009','example9@example.com','備考9','178.08');
INSERT INTO `test_database`.`encrypt_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('10','名前10','20','宮城県仙台市10','000-0000-0010','example10@example.com','備考10','179.09');

encrypt_user 既然表文件已经创建好了,下面我们来检查一下内容。

文件已加密,无法验证记录的内容。

目前,您不再需要担心第三方只需登录服务器并直接窃取表文件即可读取其中的记录。 根本不需要更改实现,所以我认为这是一个简单的安全设置。

但是,如果登录数据库,则可以正常看到数据。 如果要提高安全级别,则需要对数据库登录帐户进行良好的管理,并引入单独的加密机制。

在此过程中转换为加密表

如果最初创建未加密的表,则可以稍后将其转换为加密表。 在这种情况下,您可以使用以下 SQL 进行转换:

use <データベース名>;
ALTER TABLE <テーブル名> ENCRYPTION='Y';

use test_database;
ALTER TABLE plain_user ENCRYPTION='Y';

但是,请注意,如果记录很多,则需要时间,因为所有表文件都会被重写。