2013-02-15 15 views
6

मुझे कोर डेटा एन्क्रिप्शन के बारे में कोई प्रश्न है। मैं कोर डेटा SQLite डेटाबेस में कुछ संवेदनशील उपयोगकर्ता डेटा संग्रहीत कर रहा हूं। महत्वपूर्ण मान सभी ट्रांसफॉर्मबल हैं और मैं एईएस 256 का उपयोग एन्क्रिप्ट करने और उन्हें 'फ्लाई पर' डिक्रिप्ट करने के लिए कर रहा हूं, जिसमें प्रत्येक मूल्य के लिए एक व्यक्तिगत IV शामिल है। एन्क्रिप्शन कुंजी उपयोगकर्ता द्वारा चुने गए पासवर्ड का SHA512 हैश है। यह अब तक बहुत अच्छी तरह से काम करता है।कोर डेटा एन्क्रिप्शन

अब उपयोगकर्ता पासवर्ड के बारे में। जब उपयोगकर्ता ऐप लॉन्च करता है तो उसे अपने पासवर्ड के लिए कहा जाता है। पासवर्ड SHA512 के साथ धोया जा रहा है और आईओएस कीचेन में संग्रहीत किया जा रहा है। प्रत्येक लेखन या पढ़ने के संचालन के लिए NSValueTransformer को चाबी से पासवर्ड प्राप्त होगा। यदि ऐप बंद हो रहा है, तो मैं कीचेन से पासवर्ड हैश हटा देता हूं।

मेरे कोर डेटा डेटाबेस में मेरे पास एक विशेष इकाई है जिसमें यादृच्छिक संख्या है! = 0 क्योंकि यह केवल मूल्य है। यह जांचने के लिए कि क्या उपयोगकर्ता ने सही पासवर्ड दर्ज किया है, मैं इस इकाई को लाता हूं और संख्या पढ़ता हूं। अगर यह = है! 0, मुझे पता है कि पासवर्ड सही था क्योंकि जब डिक्रिप्शन एनएसवीएलयू ट्रांसफॉर्मर विफल रहता है तो हमेशा 0

अब मेरे वास्तविक प्रश्न: क्या आप इसे एन्क्रिप्शन पर एक अच्छा दृष्टिकोण मानेंगे? दर्ज पासवर्ड सही होने पर आप और कैसे परीक्षण करेंगे?

मैं थोड़ा चिंतित हूं कि ऐप चल रहा है, जबकि ऐप चल रहा है, जबकि चाबी हैश में पासवर्ड हैश को संग्रहीत करना सबकुछ धीमा कर देता है, क्योंकि NSValueTransformer को हर समय कीचेन तक पहुंचना पड़ता है। क्या पासवर्ड में हैश को स्मृति में रखने के लिए पर्याप्त रूप से सुरक्षित होगा, इसलिए ऐप बंद होने पर इसे हटा दिया जाएगा?

उत्तर

7

आपको पासवर्ड के हैश का उपयोग नहीं करना चाहिए, हैश को तेज़ होने के लिए डिज़ाइन किया गया है, इसलिए यह (तुलनात्मक रूप से) एक ब्रूट-फोर्स अटैक करने में आसान है। key derivation function जैसे PBKDF2 का उपयोग करें।

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

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

[संपादित करें: @JeffLockhart एक मास्टर एन्क्रिप्शन कुंजी के लिए प्रक्रिया को स्पष्ट करने का] अपना डेटा एन्क्रिप्ट करने आप एक यादृच्छिक कुंजी उत्पन्न, चलो यह कुंजी ए आप SecRandomCopyBytes का उपयोग कुंजी एक उत्पन्न करने के लिए कर सकता है, एक के उपयोग के लिए Apple's CryptoExcercise देखने के कॉल उदाहरण। आप उपयोगकर्ता डेटा एन्क्रिप्ट करने के लिए कुंजी ए का उपयोग करते हैं। कुंजी ए को सहेजने के लिए, आपको कुंजी ए को दूसरी कुंजी बी के साथ एन्क्रिप्ट करना होगा। आपको तेजी से ब्रूट-फोर्स या डिक्शनरी हमलों की वजह से सीधे कुंजी बी के रूप में पासवर्ड का उपयोग नहीं करना चाहिए। तो आप पीबीकेडीएफ के साथ पासवर्ड से एक कुंजी प्राप्त करते हैं, जैसे this स्टैक ओवरफ्लो उत्तर में। फिर आप कुंजी ए के साथ कुंजी ए एन्क्रिप्ट करते हैं, उदा। CCCrypt का उपयोग कर। आप एन्क्रिप्टेड कुंजी ए और नमक को कुंजी बी प्राप्त करने के लिए उपयोग करते हैं। डिक्रिप्ट करने के लिए, उपयोगकर्ता पासवर्ड में प्रवेश करता है, तो आप पासवर्ड और नमक का उपयोग करके कुंजी बी प्राप्त करते हैं। आप व्युत्पन्न कुंजी बी का उपयोग करके कुंजी ए को डिक्रिप्ट करते हैं। आशा है कि स्पष्ट करता है।

Secure Incremental Store

वे एक NSIncrementalStore उपवर्ग जो एक एन्क्रिप्टेड SQLite-डाटाबेस उपयोग कर रहा है को लागू किया है:

+0

क्या आप "क्या यादृच्छिक रूप से जेनरेट की गई एन्क्रिप्शन कुंजी का उपयोग करते हैं जो आप पासवर्ड के आधार पर एक कुंजी एन्क्रिप्शन कुंजी के साथ एन्क्रिप्ट करते हैं" का उपयोग कर सकते हैं? मैं अपने कोर डेटा स्टोर के कुछ फ़ील्ड एन्क्रिप्ट करना चाहता हूं और एन्क्रिप्शन करने के लिए उपयोग करने के लिए एक कुंजी उत्पन्न करने के लिए एक सर्वोत्तम अभ्यास की तलाश में हूं। मैं मानता हूं कि इसे पासवर्ड पर आधारित करना समझ में नहीं आता है क्योंकि यह बदल सकता है। –

1

आप इस पर एक नज़र हो सकता था। यह ऐप्पल के SQLite स्टोर के लिए एक ड्रॉप-इन प्रतिस्थापन है। एक मूल्य टैग के साथ आता है।

+1

"एक मूल्य टैग के साथ आता है" - आप मजाक नहीं कर रहे हैं! – kball