Menguatkuasakan Penyulitan Telus (TDE) pada Jadual MySQL (versi Windows)

Laman dikemaskini :
Tarikh penciptaan halaman :

Persekitaran operasi

Mysql
  • MySQL 8.0 Edisi Komuniti
Windows
  • Windows 11

Prasyarat

Mysql
  • MySQL 8.0 Edisi Komuniti
  • MySQL 8.0 Edisi Enterprise
Windows
  • Windows 11
  • Windows 10
Pelayan Windows
  • Windows Server 2022
  • Windows Server 2019
  • Windows Server 2016
  • Windows Server 2012 R2

prasyarat

  • Pangkalan data untuk MySQL dipasang.

Perihal Penyulitan Telus

Penyulitan Data Telus Perusahaan, seperti namanya, adalah teknologi penyulitan yang lebih selamat daripada apa-apa yang tidak. Biasanya, apabila menyulitkan, ia sering menjadi beban kepada pelaksana kerana perlu melakukan pemprosesan penyulitan dan penyahsulitan. Maksud nama ini "telus" ialah ia boleh disulitkan tanpa pelaksana membuat sebarang perubahan pada proses tersebut. Oleh itu, jika anda membuat beberapa perubahan pada tetapan pada mulanya, selebihnya akan disulitkan tanpa kebenaran, jadi ia adalah langkah keselamatan yang sangat berkesan.

Walau bagaimanapun, sebagai frasa "tidak perlu mengubah apa-apa" mencadangkan, jika anda benar-benar log masuk ke pangkalan data, anda boleh melihat data secara normal, dan jika anda mendapat rekod pangkalan data dari program, anda boleh melihat data secara normal. Sekiranya data yang diperoleh disulitkan, perlu mengubah proses, jadi ia tidak sepadan dengan kata-kata "Tidak perlu mengubah proses".

Kemudian, dalam MySQL, apa sebenarnya penyulitan telus disulitkan, "fail pangkalan data yang disimpan" atau "fail jadual" tertakluk kepada penyulitan. Seperti yang akan kita periksa kemudian, walaupun anda membuka fail secara langsung, ia hanya menyulitkannya supaya anda tidak dapat melihat kandungannya, jadi perlu mengendalikannya supaya ia tidak log masuk ke pangkalan data dalam operasi sebenar.

Mencipta jadual seperti biasa dan menyemak kandungan

Mula-mula, mari kita cipta jadual dan rekod seperti biasa. Anda boleh menciptanya mengikut kehendak anda, tetapi dalam kes ini, kami akan menciptanya dengan melaksanakan SQL dalam Workbench. Dalam kes ini, kami merancang untuk menetapkan penyulitan telus untuk jadual, jadi kami akan membuat pangkalan data seperti biasa.

CREATE DATABASE `test_database`

Jadual juga dibuat secara normal. Kandungan lajur boleh jadi apa sahaja.

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;

Saya juga akan memasukkan rekod rawak untuk memeriksa penyulitan.

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

Apabila anda mencipta pangkalan data atau jadual, ia dicipta dalam folder berikut secara lalai.

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

ProgramData Folder disembunyikan, jadi jadikannya kelihatan dalam seting Explorer.

Terdapat folder dengan nama pangkalan data yang anda cipta dalam folder, jadi bukanya.

Di dalamnya terdapat fail jadual demi jadual.

Buka fail ini dalam editor teks seperti Notepad. Oleh kerana ia adalah fail binari, saya fikir pada dasarnya terdapat garis teks yang saya tidak faham dengan baik. Jika anda melihat bahagian bawah, anda akan melihat teks rekod berdaftar.

Jika ia tidak disulitkan dengan cara ini, kandungan rekod akan diketahui walaupun fail dibuka secara langsung. Anda tidak perlu log masuk ke pangkalan data untuk mengetahui apa yang ada di dalamnya.

Mengkonfigurasikan Seting Penyulitan Lutsinar

Untuk membolehkan penyulitan telus, anda perlu memasang plug-in. Mula-mula, semak sama ada pemalam disertakan dengan arahan.

Mulakan dengan memilih "MySQL 8.0 Command Line Client" daripada menu Mula.

Selepas memasukkan kata laluan dan log masuk anda, masukkan arahan berikut:

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

Oleh kerana anda belum memasangnya, ia sepatutnya kosong.

Sekarang, mari kita sediakan pemalam. Mula-mula, cipta folder berikut: Sebenarnya, tidak kira di mana anda menciptanya atau nama apa. Tentukan ia sebagai lokasi di mana anda ingin menyimpan fail utama kemudian.

  • C:\ProgramData\MySQL\mysql-keyring

Seterusnya, buka fail berikut dalam editor teks:

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

Tambah teks berikut ke ruang kosong di bahagian bawah dan simpannya. Jika anda tidak dapat menyimpan dengan keistimewaan pentadbir, anda boleh menyimpannya ke lokasi lain dan kemudian menulis ganti fail.

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

Mulakan semula perkhidmatan MySQL. Anda juga boleh memulakannya semula dengan arahan.

Apabila anda memulakan semula, fail dicipta secara automatik dalam folder yang ditentukan.

Anda boleh mengesahkan bahawa pasang masuk dipasang dengan menjalankan arahan semak masuk sekali lagi.

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

Mencipta jadual yang disulitkan

Sekarang mari kita buat jadual yang disulitkan. Buat jadual yang serupa dengan jadual sebelumnya, tetapi kali ini menambah ENCRYPTION='Y' opsyen. Tetapan penyulitan ini nampaknya tidak mungkin dalam GUI pada masa ini, jadi ia mesti ditetapkan dengan arahan.

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;

Dengan cara ini, sebelum pemalam dikonfigurasikan, walaupun anda cuba membuat jadual yang disulitkan, ralat berikut akan dipaparkan.

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

Jika anda tidak mempunyai sebarang data, anda tidak tahu sama ada ia disulitkan, jadi saya akan cuba meletakkan data yang sama.

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 Memandangkan fail jadual telah dicipta, mari kita semak kandungannya.

Fail telah disulitkan dan kandungan rekod tidak dapat disahkan.

Buat masa ini, anda tidak perlu lagi bimbang tentang pihak ketiga membaca rekod di dalam hanya dengan log masuk ke pelayan dan mencuri fail jadual secara langsung. Tidak perlu mengubah pelaksanaan sama sekali, jadi saya fikir ia adalah tetapan keselamatan yang mudah.

Walau bagaimanapun, jika anda log masuk ke pangkalan data, anda boleh melihat data seperti biasa. Jika anda ingin meningkatkan tahap keselamatan, anda perlu menguruskan akaun log masuk pangkalan data dengan baik dan memperkenalkan mekanisme penyulitan berasingan.

Menukar kepada jadual yang disulitkan di sepanjang jalan

Jika anda pada mulanya mencipta jadual yang tidak disulitkan, anda boleh menukarnya kepada jadual yang disulitkan kemudian. Dalam kes itu, anda boleh menukarnya dengan SQL berikut:

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

Sebagai contoh

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

Walau bagaimanapun, sila ambil perhatian bahawa ia akan mengambil masa jika terdapat banyak rekod kerana semua fail jadual ditulis semula.