2014-07-22 10 views
6

यह देखते हुए कि लैरवेल का Crypt हमेशा नमक जोड़ता है, और इसलिए एक ही एन्क्रिप्शन के दो उदाहरण समान नहीं होते हैं।लार्वा क्रिप्ट - मूल्यों की तुलना

आम तौर पर, यह ठीक है क्योंकि मैं दोनों के डिक्रिप्ट संस्करण की तुलना कर सकता हूं। हालांकि, अगर मैं डेटाबेस में एन्क्रिप्ट किया गया मान खोजना चाहता हूं तो क्या होगा?

कहें कि मेरे पास users की एक तालिका है और मैं ईमेल पता एन्क्रिप्ट करना चाहता हूं। अब मैं ईमेल [email protected] ईमेल से किसी को ढूंढना चाहता हूं।

मैं इसके लिए क्वेरी लिखने के लिए कैसे जा सकता हूं? मैं सिर्फ Crypt::encrypt($email) नहीं कर सकता और खोज कर सकता हूं क्योंकि encrypt के इस पुनरावृत्ति डीबी में से एक से अलग होगा।

संपादित

वर्तमान में, केवल बात मैं के बारे में सोच सकते हैं सभी पाने के लिए, और उन के माध्यम से फ़िल्टर कर रहा है:

$match = User::all()->filter(function($record) use($email) { 
      $field = $record->email['email']; 

      if(Crypt::decrypt($field) == $email) return $record; 
     }); 

लेकिन इस भयानक है। मैं सबकुछ खोजना नहीं चाहता हूं।

+3

मुझे लगता है कि यह चारों ओर एक ही रास्ता एक निश्चित 'key' और' iv' का उपयोग कर अपने डेटा को एन्क्रिप्ट किया जाएगा है। ऐसा करने के लिए मुझे क्रिप्ट क्लास का विस्तार करना मुश्किल नहीं होगा। – Jeemusu

+0

आप उस ईमेल के हैश के साथ एक और कॉलम जोड़ने पर विचार कर सकते हैं जिसका आप तुलना कर सकते हैं। –

उत्तर

2

जैसा कि वर्णन किया गया है, आप नहीं कर सकते। अगर आपने इसे अनुकूलित करने की आवश्यकता नहीं है तो आपके द्वारा दिया गया जवाब वह तरीका है जिसे आप प्राप्त करेंगे।

आप एन्क्रिप्टेड मूल्य समझौता किए बिना पूरी तरह से यह अनुकूलन करने के लिए की जरूरत है, और के द्वारा अपने फिल्टर देरी का एक प्रमुख कारण है लौट आए और संसाधित डेटा की मात्रा को खोजने के लिए प्रोफाइल है, तो आप निम्नलिखित कर सकते हैं।

तालिका में एक नया फ़ील्ड जोड़ें जो हैश का सबसेट स्टोर करेगा। अद्वितीय ईमेल पते की संख्या के आधार पर, आप यह सबसेट कर सकते हैं कि यह सबसेट कितना बड़ा है। नोट: बेहतर, क्योंकि आप इस दृष्टिकोण का उपयोग करके एन्क्रिप्टेड मूल्य पर कुछ जानकारी लीक कर रहे हैं। उदाहरण के लिए, यदि आप ईमेल पते का 1 बाइट हैश स्टोर करते हैं, तो आप ~ 8 बिट्स द्वारा एन्क्रिप्शन की एन्ट्रॉपी को कम कर रहे हैं।

जब आप पूछते हैं, तो पहले ईमेल हैश का सबसेट बनाएं और where क्लॉज केवल उन पंक्तियों को वापस करने के लिए रखें।

यह सब मानता है कि हैश फ़ंक्शन डिक्रिप्ट चरण से सस्ता है। इस दृष्टिकोण के लिए आपको सभी हैश सबसेट की पुन: गणना करने की आवश्यकता होगी यदि आप इसका आकार बढ़ाना चाहते हैं, इसलिए एक आकार चुनना जो अर्थपूर्ण रूप से प्रदर्शन को बढ़ाता है, एन्क्रिप्शन को अनावश्यक रूप से समझौता नहीं करता है और जब आप बढ़ते हैं तो सबसे अधिक संभावना बदलने की आवश्यकता नहीं होती है ।

नोट: आपको इस स्थिति में एमडी 5 की तरह सीधे हैश का उपयोग नहीं करना चाहिए। टक्कर के लिए इसकी संवेदनशीलता की वजह से नहीं, बल्कि क्योंकि मुख्य स्थान बहुत छोटा होगा। यदि प्रदर्शन महत्वपूर्ण है और आप बड़ी मात्रा में डेटा स्टोर करते हैं, तो आप अपने आप को डॉस हमले खोलते हैं जिससे हमलावर बड़ी संख्या में ईमेल पते बनाता है जो सभी हैश को एक ही सबसेट में है। इस समस्या के खिलाफ कड़ी मेहनत के लिए, एक गुप्त कुंजी के साथ HMAC फ़ंक्शन का उपयोग करें।

याद रखें, जब तक आप जटिलता को जोड़ने के लिए की आवश्यकता होगी, के प्रदर्शन का सही कारणों - नहीं

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