यदि आपको अपने डेटाबेस में गोपनीय डेटा संग्रहीत करने की आवश्यकता है, तो आप डेटा एन्क्रिप्शन का उपयोग कर सकते हैं . SQL सर्वर सममित कुंजियों, असममित कुंजियों, प्रमाणपत्रों और पासवर्ड वाक्यांशों के साथ एन्क्रिप्शन का समर्थन करता है। मुझे लगता है कि आप, पाठक, पहले से ही इन शर्तों से परिचित हैं। इस लेख में, मैं SQL सर्वर द्वारा प्रदान किए गए कई एन्क्रिप्शन विकल्पों में से दो पर ध्यान केंद्रित करूंगा:
- पारदर्शी डेटा एन्क्रिप्शन (TDE)
- हमेशा एन्क्रिप्टेड (एई)
पारदर्शी डेटा एन्क्रिप्शन
पारदर्शी डेटा एन्क्रिप्शन (TDE) जब डेटा का उपयोग नहीं किया जाता है तो डेटा को आराम से सुरक्षित रखता है। जब डेटा का उपयोग किया जाता है, तो SQL सर्वर इसे स्वचालित रूप से डिक्रिप्ट करता है। आप TDE का उपयोग रीयल-टाइम एन्क्रिप्शन और डेटा और लॉग फ़ाइलों के डिक्रिप्शन के लिए कर सकते हैं। आप डेटाबेस एन्क्रिप्शन कुंजी (DEK) . के साथ डेटा एन्क्रिप्ट करते हैं , जो एक सममित कुंजी है। यह डेटाबेस बूट रिकॉर्ड में संग्रहीत है और इसलिए डेटाबेस पुनर्प्राप्ति प्रक्रिया के दौरान पहले से ही उपलब्ध है। आप DEK को मास्टर डेटाबेस में प्रमाणपत्र के साथ सुरक्षित रखते हैं। आप प्रमाणपत्र के बजाय एक असममित कुंजी का भी उपयोग कर सकते हैं; हालांकि, असममित कुंजी को EKM मॉड्यूल में संग्रहित किया जाना चाहिए। TDE केवल AES और ट्रिपल डेस एन्क्रिप्शन का उपयोग करता है। TDE को पहली बार 2012 के संस्करण के साथ SQL सर्वर में लागू किया गया था।
आप TDE का उपयोग केवल उपयोगकर्ता डेटाबेस पर कर सकते हैं। आप डेटाबेस एन्क्रिप्शन कुंजी निर्यात नहीं कर सकते। यह कुंजी केवल SQL सर्वर डेटाबेस इंजन द्वारा उपयोग की जाती है। अंतिम उपयोगकर्ता कभी इसका उपयोग नहीं करते हैं। यदि आप डेटाबेस के स्वामी को बदलते हैं, तो भी आपको DEK को पुन:उत्पन्न करने की आवश्यकता नहीं है।
TDE पृष्ठ स्तर पर डेटा को एन्क्रिप्ट करता है। इसके अलावा, यह लेनदेन लॉग को भी एन्क्रिप्ट करता है। आपको TDE को सक्षम करने के तुरंत बाद DEK की सुरक्षा के लिए उपयोग किए गए प्रमाणपत्र और प्रमाणपत्र की सुरक्षा के लिए उपयोग की जाने वाली निजी कुंजी का बैकअप लेना चाहिए। यदि आपको एन्क्रिप्टेड डेटाबेस को किसी अन्य SQL सर्वर इंस्टेंस में पुनर्स्थापित या संलग्न करने की आवश्यकता है, तो आपको प्रमाणपत्र और निजी कुंजी दोनों को पुनर्स्थापित करने की आवश्यकता है, या आप डेटाबेस को खोलने में सक्षम नहीं हैं। फिर से ध्यान दें कि आप DEK को निर्यात नहीं करते हैं, क्योंकि यह डेटाबेस का ही एक हिस्सा है। डेटाबेस पर TDE को अक्षम करने के बाद भी आपको DEK की सुरक्षा के लिए उपयोग किए गए प्रमाणपत्र को रखने और बनाए रखने की आवश्यकता है। ऐसा इसलिए है क्योंकि लेन-देन लॉग के कुछ हिस्सों को अभी भी एन्क्रिप्ट किया जा सकता है। जब तक आप डेटाबेस का पूरा बैकअप नहीं कर लेते तब तक प्रमाणपत्र की आवश्यकता होती है।
हमेशा एन्क्रिप्टेड
SQL सर्वर 2016 एंटरप्राइज़ संस्करण एन्क्रिप्शन का एक नया स्तर पेश करता है, जिसका नाम है ऑलवेज एनक्रिप्टेड (AE) विशेषता। यह सुविधा क्लाइंट एप्लिकेशन में डेटा को एन्क्रिप्ट करने के समान स्तर की डेटा सुरक्षा को सक्षम करती है। दरअसल, हालांकि यह एक SQL सर्वर सुविधा है, डेटा एन्क्रिप्टेड और क्लाइंट साइड पर डिक्रिप्ट किया जाता है। एन्क्रिप्शन कुंजियाँ SQL सर्वर डेटाबेस इंजन को कभी प्रकट नहीं की जाती हैं। इस तरह, एन्क्रिप्टेड डेटा के साथ SQL सर्वर इंस्टेंस पर sysadmin अनुमतियां होने से, एक डीबीए भी एन्क्रिप्शन कुंजी के बिना संवेदनशील डेटा नहीं देख सकता है। इस तरह, AE डेटा को प्रबंधित करने वाले व्यवस्थापकों और डेटा के स्वामी उपयोगकर्ताओं के बीच अलगाव करता है।
AE कुंजियां
हमेशा एन्क्रिप्टेड के लिए आपको दो चाबियों की आवश्यकता होती है। सबसे पहले, आप कॉलम मास्टर कुंजी (CMK) create बनाएं . फिर आप कॉलम एन्क्रिप्शन कुंजी (सीईके) . बनाते हैं और इसे सीएमके के साथ सुरक्षित रखें। एक एप्लिकेशन डेटा को एन्क्रिप्ट करने के लिए सीईके का उपयोग करता है। SQL सर्वर केवल एन्क्रिप्टेड डेटा संग्रहीत करता है, और इसे डिक्रिप्ट नहीं कर सकता। यह संभव है क्योंकि कॉलम मास्टर कुंजियाँ वास्तव में SQL सर्वर डेटाबेस में संग्रहीत नहीं होती हैं। डेटाबेस में, SQL सर्वर केवल उन कुंजियों के लिंक को संग्रहीत करता है। स्तंभ मास्टर कुंजियाँ SQL सर्वर के बाहर, निम्न संभावित स्थानों में से किसी एक में संग्रहीत की जाती हैं:
- वर्तमान उपयोगकर्ता के लिए Windows प्रमाणपत्र स्टोर
- स्थानीय मशीन के लिए Windows प्रमाणपत्र स्टोर
- Azure Key Vault सेवा
- एक हार्डवेयर सुरक्षा मॉड्यूल (HSM) , जो माइक्रोसॉफ्ट क्रिप्टोएपीआई या क्रिप्टोग्राफी एपीआई का समर्थन करता है:अगली पीढ़ी
कॉलम एन्क्रिप्शन कुंजियाँ डेटाबेस में संग्रहीत की जाती हैं। SQL सर्वर डेटाबेस के अंदर, कॉलम एन्क्रिप्शन कुंजियों के मानों का केवल एन्क्रिप्टेड भाग संग्रहीत किया जाता है, साथ ही कॉलम मास्टर कुंजियों के स्थान के बारे में जानकारी भी। सीईके को कभी भी डेटाबेस में एक सादे पाठ के रूप में संग्रहीत नहीं किया जाता है। जैसा कि उल्लेख किया गया है, सीएमके वास्तव में बाहरी विश्वसनीय कुंजी स्टोर में संग्रहीत हैं।
AE कुंजियों का उपयोग करना
कोई एप्लिकेशन AE सक्षम ड्राइवर का उपयोग करके AE कुंजियों और एन्क्रिप्शन का उपयोग कर सकता है, जैसे SQL सर्वर संस्करण 4.6 या उच्चतर के लिए .NET Framework डेटा प्रदाता, SQL सर्वर 6.0 या उच्चतर के लिए Microsoft JDBC ड्राइवर, या SQL सर्वर संस्करण 13.1 के लिए Windows ODBC ड्राइवर या उच्चतर। एप्लिकेशन को पैरामीटरयुक्त क्वेरी send अवश्य भेजनी चाहिए एसक्यूएल सर्वर के लिए। AE सक्षम ड्राइवर यह निर्धारित करने के लिए SQL सर्वर डेटाबेस इंजन के साथ मिलकर काम करता है कि कौन से पैरामीटर एन्क्रिप्ट या डिक्रिप्ट किए जाने चाहिए। प्रत्येक पैरामीटर के लिए जिसे एन्क्रिप्ट या डिक्रिप्ट करने की आवश्यकता होती है, ड्राइवर डेटाबेस इंजन से एन्क्रिप्शन के लिए आवश्यक मेटाडेटा प्राप्त करता है, जिसमें एन्क्रिप्शन एल्गोरिथम, संबंधित सीएमके का स्थान और संबंधित सीईके के लिए एन्क्रिप्टेड मान शामिल है। फिर ड्राइवर सीएमके स्टोर से संपर्क करता है, सीएमके को पुनः प्राप्त करता है, सीईके को डिक्रिप्ट करता है, और पैरामीटर को एन्क्रिप्ट या डिक्रिप्ट करने के लिए सीईके का उपयोग करता है। फिर ड्राइवर उसी सीईके के अगले उपयोग को गति देने के लिए सीईके को कैश करता है। निम्नलिखित आंकड़ा ग्राफिक रूप से प्रक्रिया को दिखाता है।
यह आंकड़ा पूरी प्रक्रिया को चरणों में दर्शाता है:
- क्लाइंट एप्लिकेशन एक पैरामीटरयुक्त क्वेरी बनाता है
- क्लाइंट एप्लिकेशन एई सक्षम ड्राइवर को पैरामीटरयुक्त क्वेरी भेजता है
- एई सक्षम ड्राइवर यह निर्धारित करने के लिए SQL सर्वर से संपर्क करता है कि कौन से पैरामीटर को एन्क्रिप्शन या डिक्रिप्शन की आवश्यकता है, सीएमके का स्थान, और सीईके का एन्क्रिप्टेड मान
- एई सक्षम ड्राइवर सीएमके को पुनः प्राप्त करता है और सीईके को डिक्रिप्ट करता है
- AE सक्षम ड्राइवर पैरामीटर को एन्क्रिप्ट करता है
- ड्राइवर डेटाबेस इंजन को क्वेरी भेजता है
- डेटाबेस इंजन डेटा को पुनः प्राप्त करता है और परिणाम सेट ड्राइवर को भेजता है
- यदि आवश्यक हो तो ड्राइवर डिक्रिप्शन करता है, और क्लाइंट एप्लिकेशन को परिणाम सेट भेजता है
AE एन्क्रिप्शन प्रकार
डेटाबेस इंजन एन्क्रिप्टेड कॉलम में संग्रहीत सादा पाठ डेटा पर कभी भी संचालित नहीं होता है। हालांकि, एन्क्रिप्शन प्रकार के आधार पर एन्क्रिप्टेड डेटा पर कुछ प्रश्न संभव हैं। एन्क्रिप्शन दो प्रकार के होते हैं:
- नियतात्मक एन्क्रिप्शन , जो हमेशा समान इनपुट मान के लिए समान एन्क्रिप्टेड मान उत्पन्न करता है। इस एन्क्रिप्शन के साथ, आप एन्क्रिप्टेड कॉलम को इंडेक्स कर सकते हैं और एन्क्रिप्टेड कॉलम पर पॉइंट लुकअप, इक्वलिटी जॉइन और ग्रुपिंग एक्सप्रेशन का उपयोग कर सकते हैं। हालांकि, एक दुर्भावनापूर्ण उपयोगकर्ता एन्क्रिप्टेड मूल्यों के पैटर्न का विश्लेषण करके मूल्यों का अनुमान लगाने का प्रयास कर सकता है। यह विशेष रूप से खतरनाक होता है जब कॉलम के लिए संभावित मानों का सेट अलग होता है, जिसमें कम संख्या में अलग-अलग मान होते हैं।
- यादृच्छिक एन्क्रिप्शन , जो अप्रत्याशित तरीके से डेटा को एन्क्रिप्ट करता है।
AE डेमो:ऑब्जेक्ट बनाना
यह दिखाने का समय है कि AE कुछ डेमो कोड के माध्यम से कैसे काम करता है। सबसे पहले, आइए एक डेमो डेटाबेस बनाएं और उसका उपयोग करें।
USE master; IF DB_ID(N'AEDemo') IS NULL CREATE DATABASE AEDemo; GO USE AEDemo; GO
इसके बाद, SSMS GUI में CMK बनाएं। ऑब्जेक्ट एक्सप्लोरर में, AEDemo डेटाबेस देखने के लिए डेटाबेस फ़ोल्डर को ताज़ा करें। इस डेटाबेस फ़ोल्डर का विस्तार करें, सुरक्षा सबफ़ोल्डर का विस्तार करें, फिर हमेशा एन्क्रिप्टेड कुंजी सबफ़ोल्डर, और कॉलम मास्टर कुंजी सबफ़ोल्डर पर राइट-क्लिक करें और पॉप-अप मेनू से नया कॉलम मास्टर कुंजी विकल्प चुनें। नाम टेक्स्ट बॉक्स में, AE_ColumnMasterKey लिखें, और सुनिश्चित करें कि आपने की स्टोर ड्रॉप-डाउन सूची में Windows प्रमाणपत्र स्टोर - स्थानीय मशीन विकल्प का चयन किया है, जैसा कि निम्न चित्र दिखाता है।
आप निम्न क्वेरी के साथ जांच सकते हैं कि सीएमके सफलतापूर्वक बनाया गया था या नहीं।
SELECT * FROM sys.column_master_keys;
इसके बाद, आप सीईके बनाते हैं। SSMS में, ऑब्जेक्ट एक्सप्लोरर में, कॉलम मास्टर कुंजी सबफ़ोल्डर के ठीक नीचे कॉलम एन्क्रिप्शन कुंजी सबफ़ोल्डर पर राइट-क्लिक करें और पॉप-अप मेनू से नया कॉलम एन्क्रिप्शन कुंजी विकल्प चुनें। CEK AE_ColumnEncryptionKey को नाम दें और इसे एन्क्रिप्ट करने के लिए AE_ColumnMasterKey CMK का उपयोग करें। आप जांच सकते हैं कि सीईके निर्माण निम्नलिखित प्रश्न के साथ सफल हुआ था या नहीं।
SELECT * FROM sys.column_encryption_keys;
वर्तमान में, केवल नए बाइनरी कॉलेशन, BIN2 . के साथ कोलाजंस प्रत्यय, AE के लिए समर्थित हैं। इसलिए, वर्ण कॉलम के लिए उपयुक्त कोलाज के साथ एक टेबल बनाते हैं।
CREATE TABLE dbo.Table1 (id INT, SecretDeterministic NVARCHAR(10) COLLATE Latin1_General_BIN2 ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = AE_ColumnEncryptionKey, ENCRYPTION_TYPE = DETERMINISTIC, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NULL, SecretRandomized NVARCHAR(10) COLLATE Latin1_General_BIN2 ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = AE_ColumnEncryptionKey, ENCRYPTION_TYPE = RANDOMIZED, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NULL );
AE डेमो:डेटा सम्मिलित करना
अब आप निम्न कथन के साथ डेटा की एक पंक्ति सम्मिलित करने का प्रयास कर सकते हैं।
INSERT INTO dbo.Table1 (id, SecretDeterministic, SecretRandomized) VALUES (1, N'DeterSec01', N'RandomSec1');
आपको त्रुटि 206 मिलती है, त्रुटि टेक्स्ट:"ऑपरेंड टाइप क्लैश:nvarchar nvarchar(4000) के साथ असंगत है (एन्क्रिप्शन_टाइप ='DETERMINISTIC', एन्क्रिप्शन_एल्गोरिदम_नाम ='AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name ='AE_ColumnEncryptionKey') कॉलम_डेटाबेस ='AE_Demo', key_ColumnEncryptionKey। . SQL सर्वर डेटा को एन्क्रिप्ट या डिक्रिप्ट नहीं कर सकता है। आपको क्लाइंट एप्लिकेशन से डेटा को संशोधित करने की आवश्यकता है। आप SQL सर्वर से टेबल पर सीमित संचालन कर सकते हैं। उदाहरण के लिए, आप AE कॉलम वाली टेबल पर TRUNCATE TABLE स्टेटमेंट का इस्तेमाल कर सकते हैं।
मैंने विजुअल सी # में एक बहुत ही सरल क्लाइंट विंडोज कंसोल एप्लिकेशन बनाया है। एप्लिकेशन वास्तव में केवल कुंजी पुनर्प्राप्त करता है और उपरोक्त कोड के साथ बनाई गई तालिका में एक पंक्ति डालता है। यहाँ C# कोड है।
using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; namespace AEDemo { class Program { static void Main(string[] args) { string connectionString = "Data Source=localhost; “ + “Initial Catalog=AEDemo; Integrated Security=true; ” + “Column Encryption Setting=enabled"; SqlConnection connection = new SqlConnection(connectionString); connection.Open(); if (args.Length != 3) { Console.WriteLine("Please enter a numeric “ + “and two string arguments."); return; } int id = Int32.Parse(args[0]); { using (SqlCommand cmd = connection.CreateCommand()) { cmd.CommandText = @"INSERT INTO dbo.Table1 “ + “(id, SecretDeterministic, SecretRandomized)" + " VALUES (@id, @SecretDeterministic, @SecretRandomized);"; SqlParameter paramid= cmd.CreateParameter(); paramid.ParameterName = @"@id"; paramid.DbType = DbType.Int32; paramid.Direction = ParameterDirection.Input; paramid.Value = id; cmd.Parameters.Add(paramid); SqlParameter paramSecretDeterministic = cmd.CreateParameter(); paramSecretDeterministic.ParameterName = @"@SecretDeterministic"; paramSecretDeterministic.DbType = DbType.String; paramSecretDeterministic.Direction = ParameterDirection.Input; paramSecretDeterministic.Value = "DeterSec1"; paramSecretDeterministic.Size = 10; cmd.Parameters.Add(paramSecretDeterministic); SqlParameter paramSecretRandomized = cmd.CreateParameter(); paramSecretRandomized.ParameterName = @"@SecretRandomized"; paramSecretRandomized.DbType = DbType.String; paramSecretRandomized.Direction = ParameterDirection.Input; paramSecretRandomized.Value = "RandomSec1"; paramSecretRandomized.Size = 10; cmd.Parameters.Add(paramSecretRandomized); cmd.ExecuteNonQuery(); } } connection.Close(); Console.WriteLine("Row inserted successfully"); } } }
आप डिबग मोड में विजुअल स्टूडियो से सी # कोड चला सकते हैं या एप्लिकेशन बना सकते हैं। फिर आप AEDemo.exe एप्लिकेशन को कमांड प्रॉम्प्ट से, या SSMS से SQMCMD मोड में चला सकते हैं।
AE डेमो:डेटा पढ़ना
एप्लिकेशन चलाने के बाद, आपको उसी सत्र के डेटा को SSMS में पढ़ने का प्रयास करना चाहिए जिसका उपयोग आपने तालिका बनाने के लिए किया था।
SELECT * FROM dbo.Table1;
आप केवल एन्क्रिप्टेड डेटा देख सकते हैं। अब SSMS में दूसरी क्वेरी विंडो खोलें। इस विंडो में राइट-क्लिक करें और कनेक्शन चुनें, फिर कनेक्शन बदलें। कनेक्शन संवाद में, नीचे विकल्प बटन पर क्लिक करें। डेटाबेस नाम के लिए AEDemo टाइप करें और फिर अतिरिक्त कनेक्शन पैरामीटर टैब पर क्लिक करें। टेक्स्ट बॉक्स में, "कॉलम एन्क्रिप्शन सेटिंग =सक्षम" (बिना दोहरे उद्धरण चिह्नों के) दर्ज करें। फिर कनेक्ट पर क्लिक करें।
SSMS से एक पंक्ति सम्मिलित करने के लिए पुन:प्रयास करें। निम्नलिखित क्वेरी का प्रयोग करें।
INSERT INTO dbo.Table1 (id, SecretDeterministic, SecretRandomized) VALUES (2, N'DeterSec2', N'RandomSec2');
मुझे फिर से एक त्रुटि मिली। मैं जिस SSMS संस्करण का उपयोग कर रहा हूं वह अभी भी एड-हॉक इंसर्ट को पैरामीट्रिज नहीं कर सकता है। हालांकि, आइए निम्न क्वेरी के साथ डेटा को पढ़ने का प्रयास करें।
SELECT * FROM dbo.Table1;
इस बार, क्वेरी काम करती है, और आपको निम्न परिणाम मिलते हैं:
आईडी गुप्तनियतात्मक रहस्ययादृच्छिक
———————————————
1 DeterSec1 RandomSec1
2 DeterSec2 RandomSec2
AE सीमाएं
आप पहले से ही हमेशा एन्क्रिप्टेड की कुछ सीमाएँ देख चुके हैं, जिनमें शामिल हैं:
- स्ट्रिंग के लिए केवल BIN2 कॉलेशन समर्थित हैं
- आप केवल नियतात्मक एन्क्रिप्शन वाले स्तंभों को अनुक्रमित कर सकते हैं, और उन स्तंभों पर सीमित T-SQL संचालन का उपयोग कर सकते हैं
- आप यादृच्छिक एन्क्रिप्शन वाले स्तंभों को अनुक्रमित नहीं कर सकते हैं
- AE केवल एंटरप्राइज़ और डेवलपर संस्करणों तक सीमित है
- SSMS में AE के साथ काम करना दर्दनाक हो सकता है
एई सीमाओं की अधिक विस्तृत सूची के लिए कृपया पुस्तकें ऑनलाइन देखें। हालांकि, कृपया एई की ताकत पर भी ध्यान दें। इसे लागू करना आसान है क्योंकि इसे कनेक्शन स्ट्रिंग्स के संशोधन को छोड़कर, किसी एप्लिकेशन में संशोधनों की आवश्यकता नहीं है। डेटा को एंड-टू-एंड एन्क्रिप्ट किया जाता है, क्लाइंट मेमोरी से नेटवर्क के माध्यम से डेटाबेस स्टोरेज तक। यहां तक कि डीबीए केवल SQL सर्वर के भीतर डेटा नहीं देख सकता है; यहां तक कि डीबीए को सीएमके को पढ़ने के लिए SQL सर्वर के बाहर की स्टोरेज तक पहुंच की आवश्यकता होती है। SQL सर्वर में AE और अन्य एन्क्रिप्शन विकल्प संभावनाओं का एक पूरा सेट प्रदान करते हैं, और यह आप और उस व्यावसायिक समस्या पर निर्भर करता है जिसे आप उपयुक्त विधि का चयन करने के लिए हल कर रहे हैं।
निष्कर्ष
पारदर्शी डेटा एन्क्रिप्शन का उपयोग करना बेहद आसान है। हालाँकि, डेटा सुरक्षा बहुत सीमित है। TDE केवल आराम पर डेटा की सुरक्षा करता है। हालाँकि, हमेशा एन्क्रिप्टेड वास्तव में एक शक्तिशाली विशेषता है। यह अभी भी लागू करने के लिए बहुत जटिल नहीं है, और डेटा पूरी तरह से सुरक्षित है। एन्क्रिप्शन कुंजी तक पहुंच के बिना एक डीबीए भी इसे नहीं देख सकता है। उम्मीद है, AE के लिए सीमाएं, विशेष रूप से संयोजन सीमा, SQL सर्वर के भविष्य के संस्करणों में हटा दी जाएगी।