2016-11-09 12 views
9

में एन्क्रिप्शन कुंजी और प्रमाण पत्र के साथ एन्क्रिप्टेड कॉलम नाम प्राप्त करें मैं SQL Server 2008/2012 का उपयोग कर रहा हूं। मेरे डेटाबेस में मेरे पास एक तालिका है जिसमें एन्क्रिप्टेड कॉलम है। स्तंभ निम्न क्वेरी का उपयोग करके एन्क्रिप्ट किया गया है -एसक्यूएल सर्वर

उदाहरण तालिका

CREATE TABLE [HR].[Employees](
     [EmployeeID]  [int]   NOT NULL, 
     [EmployeeName] [varchar](50) NULL, 
     [SSN]    [varchar](20) NOT NULL, 
     [EncryptedSSN] [varbinary] (200) NULL, 
CONSTRAINT [PK_Employees] PRIMARY KEY CLUSTERED 
( [EmployeeID] ASC) 
) 
GO 

मास्टर कुंजी

CREATE MASTER KEY ENCRYPTION BY 
PASSWORD = '[email protected]' 
GO 

सममित कुंजी बनाएँ और प्रमाण पत्र

सेट अप बनाएं
CREATE CERTIFICATE TestCert 
    WITH SUBJECT = 'SSN Encryption'; 
GO 

CREATE SYMMETRIC KEY HRKey 
    WITH ALGORITHM = DES 
    ENCRYPTION BY CERTIFICATE TestCert; 
GO 

डेटा एन्क्रिप्ट

OPEN SYMMETRIC KEY HRKey 
    DECRYPTION BY CERTIFICATE TestCert; 
Now we can update the EncryptedSSN column of our Employees table. 

UPDATE [HR].[Employees] 
    SET [EncryptedSSN] = EncryptByKey(Key_GUID('HRKey'), SSN); 
GO 

मैं हूँ क्वेरी का उपयोग करके इस डेटा decrypting -

OPEN SYMMETRIC KEY HRKey 
    DECRYPTION BY CERTIFICATE TestCert; 
SELECT [SSN], 
    CONVERT(VARCHAR, DecryptByKey([EncryptedSSN])) 
    AS 'Decrypted SSN' 
    FROM [HR].[Employees] 
GO 

यहाँ हम कुंजी/प्रमाणपत्र मूल्य हार्डकोडेड दे।

मैं इस प्रश्न के द्वारा अपने मेज के साथ एन्क्रिप्टेड स्तंभ नाम हो रही है -

SELECT stab.name Table_Name, sc.name Column_Name FROM sys.columns sc 
     INNER JOIN sys.types st ON sc.system_type_id=st.system_type_id 
     INNER JOIN sys.tables stab ON stab.object_id=sc.object_id 
     WHERE st.name='varbinary' 
     AND stab.is_ms_shipped=0 

और इस क्वेरी से कुंजी और प्रमाणपत्र सूची -

SELECT name, key_length, algorithm_desc, create_date, modify_date 
FROM sys.symmetric_keys; 
SELECT name, subject, start_date, expiry_date 
FROM sys.certificates 

अब मैं जो कुंजी प्राप्त करना चाहते हैं/प्रमाण पत्र किस एन्क्रिप्टेड कॉलम से संबंधित है, इसलिए मैं हार्डकोड किए गए मान दिए बिना उस कॉलम पर डिक्रिप्शन लागू कर सकता हूं। कृपया मेरी मदद करें ....

उत्तर

2

खोज के बाद और मैं समाधान है कि पाया कोशिश -

SELECT DISTINCT key_name(encryptedcol) FROM encryptedTable; 

इस क्वेरी एन्क्रिप्टेड कुंजी जो उस स्तंभ से संबंधित है परिणाम देता है।

1

आप कम से कम टी-एसक्यूएल अंतर्निहित सिस्टम फ़ंक्शंस और विचारों का उपयोग नहीं कर सकते हैं।

इसके अलावा, एक कॉलम का प्रकार varbinary हो सकता है और डेटा को एन्क्रिप्ट करने के लिए आवश्यक नहीं है।

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

TableName 
ColumnName 
Certificate 
EncryptionKey 
IsSymmetric 

यह न सही काम के आसपास है (हाँ, आप डेटा को बनाए रखा करने की जरूरत है), लेकिन अगर नए कॉलम एन्क्रिप्टेड नहीं होते लगातार यह काम कर सकते हैं।

संबंधित मुद्दे