Uveljavite pregledno šifriranje (TDE) v tabelah MySQL (različica Windows)

Stran posodobljena :
Datum ustvarjanja strani :

Delovno okolje

MySQL
  • MySQL 8.0 Izdaja skupnosti
Windows
  • Windows 11

Predpogoji

MySQL
  • MySQL 8.0 Izdaja skupnosti
  • MySQL 8.0 Enterprise izdaja
Windows
  • Windows 11
  • Windows 10
Windows Server
  • Windows Server 2022
  • Windows Server 2019
  • Windows Server 2016
  • Windows Server 2012 R2

Pogoj

  • Nameščena je baza podatkov za MySQL.

O preglednem šifriranju

Pregledno šifriranje podatkov v podjetju, kot že ime pove, je tehnologija šifriranja, ki je varnejša od vsega, kar ne. Običajno je pri šifriranju pogosto breme za izvajalca, ker je potrebno izvesti obdelavo šifriranja in dešifriranja. Pomen tega imena "pregleden" je, da ga je mogoče šifrirati, ne da bi izvajalec spremenil proces. Torej, če na začetku naredite nekaj sprememb nastavitev, bo ostalo šifrirano brez dovoljenja, zato je to zelo učinkovit varnostni ukrep.

Vendar, kot namiguje besedna zveza "ni treba ničesar spreminjati", če se dejansko prijavite v bazo podatkov, lahko podatke normalno vidite in če dobite zapis baze podatkov iz programa, lahko podatke normalno vidite. Če so pridobljeni podatki šifrirani, bo treba postopek spremeniti, tako da se ne bo ujemal z besedilom "Ni potrebe po spreminjanju postopka".

Nato je v MySQL šifrirano tisto, kar je natančno pregledno šifriranje, "shranjene datoteke baze podatkov" ali "datoteke tabele" so predmet šifriranja. Kot bomo kasneje preverili, tudi če datoteko odprete neposredno, jo šifrira samo tako, da ne vidite vsebine, zato jo je treba upravljati tako, da ni prijavljena v bazo podatkov v dejanskem delovanju.

Ustvarite tabelo normalno in preverite vsebino

Najprej ustvarimo tabelo in zapise normalno. Ustvarite ga lahko, kakor želite, vendar ga bomo v tem primeru ustvarili z izvajanjem SQL v delovni mizi. V tem primeru nameravamo nastaviti pregledno šifriranje tabele, tako da bomo bazo podatkov ustvarili normalno.

CREATE DATABASE `test_database`

Miza je izdelana tudi normalno. Vsebina stolpca je lahko karkoli.

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;

Prav tako bom vnesel naključni zapis, da preverim šifriranje.

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

Ko ustvarite zbirko podatkov ali tabelo, je privzeto ustvarjena v tej mapi.

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

ProgramData Mapa je skrita, zato jo naredite vidno v nastavitvah Raziskovalca.

V mapi je mapa z imenom zbirke podatkov, ki ste jo ustvarili, zato jo odprite.

V notranjosti je datoteka po tabeli.

Odprite to datoteko v urejevalniku besedila, kot je Beležnica. Ker gre za binarno datoteko, mislim, da v bistvu obstaja vrstica besedila, ki je ne razumem dobro. Če pogledate na dno, boste videli besedilo registriranega zapisa.

Če ni šifrirana na ta način, bo vsebina zapisa znana, tudi če je datoteka odprta neposredno. Ni se vam treba prijaviti v zbirko podatkov, da bi vedeli, kaj je notri.

Konfiguriranje nastavitev preglednega šifriranja

Če želite omogočiti pregledno šifriranje, morate namestiti vtičnik. Najprej preverite, ali je vtičnik vključen v ukaz.

Zaženite ga tako, da v meniju Start izberete »MySQL 8.0 Command Line Client«.

Po vnosu gesla in prijavi vnesite naslednji ukaz:

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

Ker ga še niste namestili, mora biti prazen.

Zdaj pa nastavimo vtičnik. Najprej ustvarite naslednje mape: Pravzaprav ni pomembno, kje ga ustvarite ali kakšno ime je. Določite ga kot mesto, kamor želite pozneje shraniti datoteko s ključi.

  • C:\ProgramData\MySQL\mysql-keyring

Nato odprite naslednjo datoteko v urejevalniku besedila:

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

Dodajte naslednje besedilo praznemu prostoru na dnu in ga shranite. Če ne morete shraniti s skrbniškimi pravicami, jo lahko shranite na drugo mesto in nato prepišete datoteko.

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

Znova zaženite storitev MySQL. Z ukazom ga lahko tudi znova zaženete.

Ko znova zaženete datoteko, se datoteka samodejno ustvari v določeni mapi.

Namestitev vtičnika lahko preverite tako, da znova zaženete ukaz check plug-in.

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

Ustvarjanje šifrirane tabele

Zdaj pa ustvarimo šifrirano tabelo. Ustvarite tabelo, podobno prejšnji, vendar tokrat dodajte ENCRYPTION='Y' možnosti. Ta nastavitev šifriranja se trenutno ne zdi mogoča v grafičnem uporabniškem vmesniku, zato jo je treba nastaviti z ukazom.

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;

Mimogrede, preden je vtičnik konfiguriran, tudi če poskusite ustvariti šifrirano tabelo, se prikaže naslednja napaka.

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

Če nimate nobenih podatkov, ne veste, ali so šifrirani, zato bom poskusil vnesti iste podatke.

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 Ker je datoteka tabele ustvarjena, preverimo vsebino.

Datoteka je šifrirana in vsebine zapisa ni mogoče preveriti.

Zaenkrat vam ni več treba skrbeti, da bi tretja oseba brala zapise v notranjosti samo tako, da se prijavite v strežnik in neposredno ukradete datoteko tabele. Izvajanja sploh ni treba spreminjati, zato menim, da je to enostavna varnostna nastavitev.

Če pa se prijavite v zbirko podatkov, lahko podatke vidite normalno. Če želite povečati raven varnosti, morate dobro upravljati račun za prijavo v bazo podatkov in uvesti ločen mehanizem šifriranja.

Pretvarjanje v šifrirano tabelo na poti

Če na začetku ustvarite nešifrirano tabelo, jo lahko pozneje pretvorite v šifrirano tabelo. V tem primeru ga lahko pretvorite z naslednjim SQL:

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

primer

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

Vendar upoštevajte, da bo trajalo nekaj časa, če bo veliko zapisov, ker so vse datoteke tabele prepisane.