MySQL टेबल्स (Windows) के लिए पारदर्शी एन्क्रिप्शन (TDE)

पेज निर्माण की तारीख :

ऑपरेशन पुष्टिकरण वातावरण

मायएसक्यूएल
  • MySQL 8.0 सामुदायिक संस्करण
विंडोज़
  • विंडोज 11

आवश्यक वातावरण

मायएसक्यूएल
  • MySQL 8.0 सामुदायिक संस्करण
  • MySQL 8.0 एंटरप्राइज़ संस्करण
विंडोज़
  • विंडोज 11
  • विंडोज 10
विंडोज सर्वर
  • विंडोज सर्वर 2022
  • विंडोज सर्वर 2019
  • विंडोज सर्वर 2016
  • विंडोज सर्वर 2012 R2

पूर्व शर्त

  • MySQL डेटाबेस स्थापित होना चाहिए

पारदर्शी एन्क्रिप्शन के बारे में

ट्रांसपेरेंट डेटा एन्क्रिप्शन (Enterprise Transparent Data Encryption) एक ऐसी तकनीक है जो नाम से ही पता चलता है कि Encrypts करती है, और ऐसा न करने से ज्यादा सुरक्षित है। आम तौर पर, जब एन्क्रिप्ट किया जाता है, तो यह अक्सर कार्यान्वयनकर्ता पर बोझ होता है क्योंकि एन्क्रिप्शन और डिक्रिप्शन प्रसंस्करण करना आवश्यक होता है। इस "पारदर्शी" का अर्थ यह है कि इसे कार्यान्वयनकर्ता द्वारा प्रसंस्करण में कोई बदलाव किए बिना एन्क्रिप्ट किया जा सकता है। इसलिए, यह एक बहुत ही प्रभावी सुरक्षा उपाय है क्योंकि शुरुआत में सेटिंग्स के थोड़े से बदलाव के बाद यह अपने आप एन्क्रिप्ट किया जाता है।

हालाँकि, जैसा कि वाक्यांश "कोई परिवर्तन करने की आवश्यकता नहीं है" से पता चलता है, यदि आप वास्तव में डेटाबेस में लॉग इन करते हैं, तो आप डेटा को सामान्य रूप से देख सकते हैं, और यदि आपको प्रोग्राम से डेटाबेस रिकॉर्ड मिलते हैं, तो आप डेटा को सामान्य रूप से देख सकते हैं। यदि प्राप्त डेटा एन्क्रिप्ट किया गया है, तो प्रसंस्करण में परिवर्तन करना आवश्यक होगा, इसलिए यह कथन से मेल नहीं खाएगा "प्रसंस्करण में कोई परिवर्तन आवश्यक नहीं है"।

तो, MySQL में पारदर्शी एन्क्रिप्शन वास्तव में क्या है, और "संग्रहीत डेटाबेस फ़ाइलें" या "टेबल फ़ाइलें" एन्क्रिप्ट की गई हैं। जैसा कि मैं बाद में जांच करूंगा, भले ही आप सीधे फ़ाइल खोलें, यह केवल एन्क्रिप्ट किया गया है ताकि सामग्री को देखा न जा सके, इसलिए इसे संचालित करना आवश्यक है ताकि यह वास्तविक ऑपरेशन में डेटाबेस में लॉग इन न करे।

सामान्य रूप से एक तालिका बनाएं और सामग्री की जांच करें

सबसे पहले, आइए सामान्य रूप से एक तालिका और एक रिकॉर्ड बनाएं। आप इसे अपनी इच्छानुसार बना सकते हैं, लेकिन इस बार मैं इसे बनाने के लिए वर्कबेंच में एसक्यूएल चलाऊंगा। इस बार, हम तालिका के लिए पारदर्शी एन्क्रिप्शन स्थापित करने की योजना बना रहे हैं, इसलिए हम सामान्य रूप से एक डेटाबेस बनाएंगे।

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 सर्वर 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-keyring

फिर निम्न फ़ाइल को टेक्स्ट एडिटर में खोलें।

  • C:\ProgramData\MySQL\MySQL सर्वर 8.0\my.ini

निम्न पाठ को नीचे की जगह में जोड़ें और इसे सहेजें। यदि आप व्यवस्थापक विशेषाधिकारों के साथ नहीं सहेज सकते हैं, तो आप इसे किसी अन्य स्थान पर सहेज सकते हैं और फिर फ़ाइल को अधिलेखित कर सकते हैं।

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

MySQL सेवा को पुनरारंभ करें। आप इसे एक कमांड के साथ पुनरारंभ कर सकते हैं।

पुनरारंभ करने के बाद, फ़ाइल स्वचालित रूप से निर्दिष्ट फ़ोल्डर में बनाई जाएगी।

आप प्लगइन स्थापित है सत्यापित करने के लिए प्लग इन जाँच आदेश फिर से चला सकते हैं।

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

हालाँकि, सावधान रहें कि सभी तालिका फ़ाइलों को फिर से न लिखें, क्योंकि बहुत अधिक रिकॉर्ड होने पर इसमें लंबा समय लगेगा।