對 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';

但是,請注意,如果記錄很多,則需要時間,因為所有表檔都會被重寫。