Mã hóa minh bạch (TDE) cho bảng MySQL (Windows)
Môi trường xác nhận hoạt động
- MySQL
-
- Phiên bản cộng đồng MySQL 8.0
- Windows
-
- Cửa sổ 11
Môi trường yêu cầu
- MySQL
-
- Phiên bản cộng đồng MySQL 8.0
- Phiên bản MySQL 8.0 Enterprise
- Windows
-
- Cửa sổ 11
- Cửa sổ 10
- Máy chủ Windows
-
- Máy chủ Windows 2022
- Máy chủ Windows 2019
- Máy chủ Windows 2016
- Máy chủ Windows 2012 R2
Điều kiện tiên quyết
- Cơ sở dữ liệu MySQL phải được cài đặt
Giới thiệu về mã hóa minh bạch
Mã hóa dữ liệu minh bạch (Enterprise Transparent Data Encryption) là một công nghệ mã hóa như tên gọi cho thấy, và nó an toàn hơn là không làm điều này. Thông thường, khi thực hiện mã hóa thường là gánh nặng cho người thực hiện vì cần phải thực hiện xử lý mã hóa và giải mã. Ý nghĩa của "minh bạch" này là nó có thể được mã hóa mà không cần người triển khai thực hiện bất kỳ thay đổi nào đối với quá trình xử lý. Do đó, đây là một biện pháp bảo mật rất hiệu quả vì nó được mã hóa riêng sau khi điều chỉnh một chút cài đặt ngay từ đầu.
Tuy nhiên, như cụm từ "không cần thực hiện bất kỳ thay đổi nào" gợi ý, nếu bạn thực sự đăng nhập vào cơ sở dữ liệu, bạn có thể xem dữ liệu bình thường và nếu bạn nhận được các bản ghi cơ sở dữ liệu từ chương trình, bạn có thể xem dữ liệu bình thường. Nếu dữ liệu thu được được mã hóa, sẽ cần phải thực hiện các thay đổi đối với quá trình xử lý, vì vậy nó sẽ không khớp với tuyên bố "không cần thay đổi đối với quá trình xử lý".
Vì vậy, chính xác thì mã hóa minh bạch trong MySQL là gì, và "tệp cơ sở dữ liệu được lưu trữ" hoặc "tệp bảng" được mã hóa. Như tôi sẽ kiểm tra sau, ngay cả khi bạn mở tệp trực tiếp, nó chỉ được mã hóa để không thể nhìn thấy nội dung, vì vậy cần phải vận hành nó để nó không đăng nhập vào cơ sở dữ liệu trong hoạt động thực tế.
Tạo một bảng bình thường và kiểm tra nội dung
Đầu tiên, hãy tạo một bảng và một bản ghi một cách bình thường. Bạn có thể tạo nó theo cách bạn muốn, nhưng lần này tôi sẽ chạy SQL trong Workbench để tạo nó. Lần này, chúng tôi dự định thiết lập mã hóa minh bạch cho bảng, vì vậy chúng tôi sẽ tạo cơ sở dữ liệu một cách bình thường.
CREATE DATABASE `test_database`
Tôi cũng làm một chiếc bàn bình thường. Dù nội dung cột là gì, nó có thể như vậy.
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;
Giữ hồ sơ để kiểm tra mã hóa.
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');
Khi bạn tạo cơ sở dữ liệu hoặc bảng, nó được tạo trong các thư mục sau theo mặc định:
- C:\ProgramData\MySQL\MySQL Server 8.0\Data
ProgramData
Thư mục là một thư mục ẩn, vì vậy hãy đảm bảo rằng nó hiển thị trong cài đặt File Explorer.
Bên trong thư mục là một thư mục có tên của cơ sở dữ liệu bạn đã tạo, vì vậy hãy mở nó.
Bên trong là các tệp cấp bảng.
Mở tệp này trong trình soạn thảo văn bản như Notepad. Vì nó là một tệp nhị phân nên tôi nghĩ về cơ bản có văn bản mà tôi không hiểu rõ. Nếu bạn nhìn vào phía dưới, bạn sẽ thấy văn bản của bản ghi đã đăng ký.
Nếu nó không được mã hóa theo cách này, bạn có thể biết nội dung của bản ghi chỉ bằng cách mở tệp trực tiếp. Bạn không cần phải đăng nhập vào cơ sở dữ liệu để biết những gì bên trong.
Thiết lập mã hóa minh bạch
Để bật Mã hóa trong suốt, bạn cần cài đặt một plugin. Đầu tiên, hãy kiểm tra lệnh để xem plugin có được bao gồm hay không.
Chọn MySQL 8.0 Command Line Client từ menu Start để khởi chạy nó.
Khi bạn đã nhập mật khẩu và đăng nhập, hãy nhập lệnh sau:
SELECT PLUGIN_NAME,PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'keyring%';
Tôi chưa cài đặt nó, vì vậy nó sẽ trống.
Bây giờ chúng ta hãy định cấu hình plugin. Đầu tiên, hãy tạo các thư mục sau: Trên thực tế, địa điểm hoặc tên bạn tạo ra là tốt. Chỉ định nó làm vị trí để lưu tệp khóa sau này.
- C:\ProgramData\MySQL\mysql-keyring
Sau đó mở tệp sau trong trình soạn thảo văn bản.
- C:\ProgramData\MySQL\MySQL Server 8.0\my.ini
Thêm văn bản sau vào khoảng trống dưới cùng và lưu nó. Nếu bạn không thể lưu với đặc quyền quản trị viên, bạn có thể lưu nó vào một vị trí khác và sau đó ghi đè lên tệp.
early-plugin-load=keyring_file.dll
keyring_file_data=C:\ProgramData\MySQL\mysql-keyring\keyring
Khởi động lại dịch vụ MySQL. Bạn có thể khởi động lại nó bằng một lệnh.
Sau khi khởi động lại, tệp sẽ tự động được tạo trong thư mục được chỉ định.
Bạn có thể chạy lại lệnh Check Plugin để xác minh rằng plugin đã được cài đặt.
SELECT PLUGIN_NAME,PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'keyring%';
Tạo bảng mã hóa
Bây giờ chúng ta hãy tạo một bảng được mã hóa.
Tạo một bảng tương tự như bảng mà chúng ta đã có trước đây, nhưng bây giờ hãy thêm vào các tùy chọn ENCRYPTION='Y'
.
Cài đặt mã hóa này dường như không thể định cấu hình được trong GUI tại thời điểm này, vì vậy nó phải được đặt bằng lệnh.
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;
Nhân tiện, trước khi thiết lập plugin, ngay cả khi bạn cố gắng tạo bảng mã hóa, bạn sẽ nhận được lỗi sau.
Can't find master key from keyring, please check in the server log if a keyring is loaded and initialized successfully. キーリングからマスターキーが見つかりません。キーリングが正常にロードされ、初期化されているかどうかをサーバーログで確認してください。
Nếu bạn không có dữ liệu, bạn không biết nó có được mã hóa hay không, vì vậy tôi sẽ cố gắng đặt dữ liệu tương tự.
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
Một tệp bảng đã được tạo, vì vậy hãy kiểm tra nội dung.
Tệp đã được mã hóa và nội dung của bản ghi không thể được xác minh.
Hiện tại, tôi không còn phải lo lắng về việc có thể đọc các bản ghi bên trong chỉ bằng cách đăng nhập vào máy chủ với bên thứ ba và đánh cắp trực tiếp tệp bảng. Tôi nghĩ đó là một cài đặt bảo mật dễ dàng vì không cần phải thay đổi việc triển khai.
Tuy nhiên, nếu bạn đăng nhập vào cơ sở dữ liệu, bạn có thể xem dữ liệu bình thường. Nếu bạn muốn tăng mức độ bảo mật, bạn cần quản lý tài khoản đăng nhập cơ sở dữ liệu và giới thiệu một cơ chế mã hóa riêng biệt.
Chuyển đổi sang bảng được mã hóa trong quá trình
Nếu bạn tạo một bảng không được mã hóa ngay từ đầu, bạn có thể chuyển đổi nó thành một bảng được mã hóa sau này. Trong trường hợp đó, bạn có thể chuyển đổi nó bằng SQL sau:
use <データベース名>;
ALTER TABLE <テーブル名> ENCRYPTION='Y';
ví dụ
use test_database;
ALTER TABLE plain_user ENCRYPTION='Y';
Tuy nhiên, hãy cẩn thận không viết lại tất cả các tệp bảng, vì sẽ mất nhiều thời gian nếu có quá nhiều bản ghi.