2010-08-24 20 views
10

में एसक्यूएल एन्क्रिप्टेड कॉलम मैं सममित कुंजी का उपयोग कर SQL कॉलम स्तर एन्क्रिप्शन लागू करने के लिए देख रहा हूं। डाटाबेस मास्टर कुंजी, सर्टिफिकेट्स और सममित कुंजी बनाने के लिए आवश्यक प्रारंभिक चरण सीधे आगे दिखते हैं और मैंने सफलतापूर्वक सममित कुंजी का उपयोग करके डेटा एन्क्रिप्ट/डिक्रिप्ट करने का परीक्षण किया है।WHERE क्लॉज

हालांकि, डेटा एन्क्रिप्टेड होने के बाद, मुझे नहीं पता कि इसे कैसे पूछना सर्वोत्तम है। जैसे

SELECT PlainTextA, PlainTextB, PlainTextC 
WHERE CONVERT(varchar, DECRYPTBYKEY(EncyptedColumn)) = @SearchTerm 

निश्चित रूप से एक पूर्ण तालिका स्कैन में परिणाम देगा?

एक और विकल्प जो मैंने सोचा था कि काम कर सकता है पहले खोज मानदंड को एन्क्रिप्ट करना है उदा।

SELECT PlainTextA, PlainTextB, PlainTextC 
WHERE EncyptedColumn = ENCRYPTBYKEY(KEY_GUID('KeyName'), @SearchTerm) 

लेकिन यह काम नहीं करता है क्योंकि एन्क्रिप्टेड मान हमेशा उत्पन्न होता है।

किसी भी सुझाव की सराहना की जाएगी।

उत्तर

10

विशिष्ट तरीका स्टोर करने के लिए दोनों एन्क्रिप्टेड मूल्य और की एक-तरफ़ा हैश है अच्छा लगेगा मूल्य। जब आप एक विशिष्ट मूल्य की तलाश करते हैं, तो आप हैश की तलाश करेंगे। इस तरह से आप कुशलतापूर्वक क्वेरी कर सकता है, डब्ल्यू/क्रम में हर पंक्ति डिक्रिप्ट करने के लिए मूल्य आप रुचि रखते हैं खोजने के लिए होने o:

create table Table (
EncryptedColumn varbinary(max), 
HashValue binary(20), 
PlainA int, 
PlainB varchar(256), 
PlainC Datetime); 

create index ndxTableHash on Table(HashValue); 

select PlainA, plainB, PlainC 
from table 
where HashValue = HashBytes('SHA1', @searchTerm); 

सिद्धांत रूप में, आप एक बार एक नीला चाँद में एक हैश संघर्ष हो सकता है, पागल-सुरक्षित आप decrypted स्तंभ पर एक दोहरी जांच जोड़ने होने के लिए:

select PlainA, plainB, PlainC 
from table 
where HashValue = HashBytes('SHA1', @searchTerm) 
and DecryptByKey(..., EncryptedColumn) = @searchTerm; 

इसके अलावा Indexing encrypted data और SQL Server 2005: searching encrypted data देखते हैं।

+2

बीटीडब्ल्यू, एक चीज जो आप बिल्कुल ** ** नहीं करते हैं, हैश को एक पंक्ति विशिष्ट मूल्य (पीके) के साथ नमक को नमक करना है: आप वास्तव में स्क्वायर 1 पर वापस आ जाएंगे, यह जानने के लिए कि क्या खोजना है। इस परिदृश्य के लिए आप * साइट ग्लोबल * वैल्यू के साथ हैश को नमक कर सकते हैं। इंद्रधनुष टेबल हमलों को रोकने के लिए यह पर्याप्त है, लेकिन डेटा को खोजने योग्य रखता है। ध्यान दें कि समान सामग्री वाले दो अलग-अलग पंक्तियों में * एक ही हैश है, इसलिए आप कुछ जानकारी उजागर कर रहे हैं, लेकिन यह डेटा खोजने योग्य होने की परिभाषा है। –

+0

"हालांकि ध्यान दें कि समान सामग्री वाले दो अलग-अलग पंक्तियों में एक ही हैश होगा" - यह हैशिंग का उपयोग करने के साथ मेरी मुख्य चिंता थी क्योंकि यह सुरक्षा के स्तर को कम कर देता है, हालांकि जिस तालिका में मैं काम कर रहा हूं, उसके पास 4 से 5 एन्क्रिप्टेड कॉलम होंगे और यदि मैं केवल उनमें से एक के लिए एक संबंधित हैश कॉलम जोड़ता हूं, तो यह स्वीकार्य हो सकता है। –

+0

ध्यान दें कि तालिका में हैश टकराव जन्मदिन-हमले (मिल-इन-द-बीच) के अधीन है, इसलिए अंतर्ज्ञान से काफी अधिक है। अभी भी SHA1 में 20 बाइट्स पर एक बहुत बड़ी पता स्थान है। –

2

आपके पास एक विकल्प है जो तालिका में एक नया कॉलम जोड़ता है (या उसमें एक गणना कॉलम के साथ WITH SCHEMABINDING देखें, और इंडेक्स जो) खोज मूल्य के एक तरफ HASH के साथ। यह एक मजबूत हैश होना नहीं है - something as simple as CHECKSUM will work। फिर आपके खोज में खोज मूल्य हैश है और इसे हैश द्वारा फ़िल्टर करें, जो अनुक्रमित है। इस तरह, आप वास्तव में मूल्य को उजागर किए बिना कुछ खोजने योग्य और अनुक्रमणीय का खुलासा कर सकते हैं।

हालांकि, वहाँ एक और तरीका यह सीधे करना है अगर, मुझे पता है कि यह क्या है :)

+0

उत्तर और लिंक के लिए धन्यवाद। मुझे लगता है कि नमक के रूप में प्राथमिक कुंजी का उपयोग करके हैशिंग से पहले मूल्य को नमक करना सबसे अच्छा होगा? –

+1

नहीं - आप मूल्य को नमक नहीं करना चाहेंगे, जब तक (रीमस कहता है) यह किसी प्रकार का "ग्लोबल नमक" नहीं है, और फिर यह वास्तव में नमक नहीं है। यदि आप अपने मूल्यों को नमक करते हैं, तो आपकी अनुक्रमणिका लुकअप असंभव हो जाती है, क्योंकि प्रत्येक पंक्ति के लिए नमक अलग होता है। – SqlRyan

-1

एक और विकल्प एक दृश्य का उपयोग करना है जिसमें डिक्रिप्ट किए गए मान का एक स्तंभ शामिल है और इसके अनुसार रिकॉर्ड ढूंढें।

SELECT PlainTextA, PlainTextB, PlainTextC from TheView 
WHERE DecryptedColumn = @SearchTerm 
संबंधित मुद्दे