2013-05-14 6 views
6

मैं SQLCipher for Android का उपयोग कर रहा हूं और यह जांचने का सही तरीका निर्धारित करने का प्रयास कर रहा हूं कि उपयोगकर्ता द्वारा प्रदान किया गया पासवर्ड मान्य है या नहीं।क्या यह जांचने का कोई सही तरीका है कि उपयोगकर्ता द्वारा प्रदत्त SQLCipher पासवर्ड Android पर मान्य है या नहीं?

मेरा पहला झुकाव SQLiteOpenHelper.getReadableDatabase(password) के SQLCipher कार्यान्वयन का उपयोग करके दिए गए पासवर्ड के साथ डेटाबेस को खोलने और खोलने के लिए था, और फिर SQLiteException को पॉप आउट करता है।

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

इस बिंदु पर, एंड्रॉइड लाइब्रेरी लोकेल सेट करने का प्रयास करती है, और अंतर्निहित डेटाबेस "एन्क्रिप्टेड या डेटाबेस नहीं" SQLiteException फेंकता है, जिसे पकड़ा जाता है और पुनर्स्थापित किया जाता है; लेकिन इससे पहले, लॉग में एक असंबंधित त्रुटि लिखा जाता है, अनिवार्य रूप से कह रहा है कि लोकेल सेट नहीं किया जा सकता है और डेटाबेस बंद हो रहा है (एक स्टैक ट्रेस के साथ)। चूंकि यह विशेष रूप से एंड्रॉइड लाइब्रेरी द्वारा लिखा गया है, इसलिए मैं इसे दबा नहीं सकता, लॉग में एक बदसूरत त्रुटि छोड़कर जो वास्तव में मेरी मूल समस्या से संबंधित नहीं है, जो बस गलत पासवर्ड में पारित हुआ था।

क्योंकि एंड्रॉइड लाइब्रेरी सी-स्तरीय कॉल का पर्दाफाश नहीं करती है, इसलिए मैं केवल Testing the Key से संबंधित SQLCipher API दस्तावेज़ में वर्णित विधि का उपयोग नहीं कर सकता, क्योंकि मेरे पास डेटाबेस को सीधे खोलने की पहुंच नहीं है।

मैं SQLiteDatabaseHook का उपयोग करने की ओर झुकता हूं, लेकिन सबसे अच्छा मैं बता सकता हूं, जो SQLiteOpenHelper के उपयोग को रोकता है, जो एक हुक सेट करने का तरीका प्रदान नहीं करता है।

क्या किसी और को यह जांचने का कोई बेहतर तरीका पता है कि कोई इनपुट पासफ्रेज़ SQLCipher Android API के माध्यम से SQLCipher डेटाबेस को ठीक से डिक्रिप्ट करता है या नहीं? मैं पूरी तरह से एक विधि को कॉल करने की उम्मीद करता हूं और फेंकने वाले अपवाद की जांच करता हूं - जो मैं नहीं चाहता हूं वह ऑपरेशन के लिए डेटाबेस पर बाहरी प्रसंस्करण (जैसे सेट लोकेल) करने और निष्पादित करने के लिए है और मेरे लॉग में पूरी तरह से अप्रचलित त्रुटि लिखना है।

+0

"...: कम से कम जब मैं इस सवाल का पाया, मैं कुछ कोड कैसे चेक-अप :)

तरह से मैं एंड्रॉयड में यह करने के लिए करते हैं यह देखने के लिए प्यार करता था होता यह हैयह वास्तव में मेरी मूल समस्या से असंबंधित है, जो कि बस गलत पासवर्ड में पारित किया गया था "- नहीं, यह मूल समस्या है: आपने गलत पासवर्ड पारित किया है, यही कारण है कि सेट-लोकेल ऑपरेशन विफल हो गया।" मैं कर सकता हूं कुंजी जांचने के संबंध में SQLCipher API दस्तावेज़ में वर्णित विधि का उपयोग न करें ... "- आपके परिणाम जो आप वर्तमान में प्राप्त कर रहे हैं उसके समान होंगे, सिवाय इसके कि लॉगकैट में किसी भी बाहरी निशान के बिना। इसके अलावा, आपका मानदंड क्या है "किसी भी बेहतर तरीके" के लिए? – CommonsWare

+0

मुझे खेद है कि मैंने स्पष्ट रूप से खुद को स्पष्ट नहीं किया। मैं बस इतना करना चाहता हूं कि मैं गलत पासवर्ड में पास हो गया हूं या नहीं। मैं पूरी तरह से सहमत हूं कि मेरे परिणाम समान होंगे (बनाना कॉल, एक त्रुटि की जांच करें)। "किसी भी बेहतर तरीके" के लिए मेरा मानदंड बाहरी सेटलोकेल प्रसंस्करण और त्रुटि के बिना है। – mWillis

+0

मैं उन्हें त्रुटि लॉग इन नहीं करने के लिए बस एक समस्या दर्ज करूंगा और इसके बारे में चिंता न करें। , मैं एम के लिए sqlcipher Google समूह की सलाह देते हैं अयस्क सहायता – CommonsWare

उत्तर

0

Android के लिए SQLCipher, जब तक किसी SQL आदेश sqlite3_key निम्नलिखित डेटाबेस के खिलाफ जारी किया जाता है, इस तरह के setLocale(...) विधि के रूप में नहीं जानता है कि पासवर्ड आपके द्वारा दी गई अमान्य है एक sqlite3_key आह्वान के बाद के रूप में डेटाबेस कुंजी नहीं किया जाता है आप उपरोक्त संदर्भ। समस्या यह है कि, एक अवैध कुंजी प्रदान करना संभवतः अन्य संभावित परिदृश्यों में से एक हो सकता है जो कि पहले SQL कथन निष्पादित किए जाने पर समस्या हो सकती है। एक दूषित डेटा फ़ाइल, एक असफल एचएमएसी चेक, या एक गैर डेटाबेस फ़ाइल खोलने के परिणामस्वरूप यह त्रुटि संदेश हो सकता है। इसके विस्तृत विवरण के लिए कृपया इस thread की समीक्षा करें। डेटाबेस खोलने का प्रयास करते समय अपवाद को पकड़ना और क्लाइंट एप्लिकेशन के अनुसार तदनुसार संभालना सबसे अच्छा होगा।

+0

मुझे निश्चित रूप से वह सब मिलता है। मेरी समस्या यह है कि मेरे प्रश्न में "कुंजी जांचना" दोहराने का कोई तरीका नहीं है। आईओएस एपीआई के साथ मेरे पास सी एपीआई तक पहुंच है, इसलिए मैं डेटाबेस खोल सकता हूं, 'pragma key', और फिर' sqlite_master' से पढ़ने का प्रयास करें। अगर यह कोई त्रुटि फेंकता है, तो मैं उसे पकड़ सकता हूं और इसे एक दिन बुला सकता हूं। एंड्रॉइड एपीआई के माध्यम से, हालांकि, मैं इसे इतना आसान नहीं कर सकता, क्योंकि मुझे 'openOrCreateDatabase'' कॉल करना होगा जो डीबी खोलता है, इसे चाबियाँ देता है, फिर लोकेल सेट करने का प्रयास करता है, जहां त्रुटि होती है। यह इतना बुरा नहीं है, लेकिन अपरिवर्तनीय लॉग आउटपुट निराशाजनक है। – mWillis

0

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

// Simply get an instance of SQLiteOpenHelper. 
    dbHelperObj = myDatabase.getInstance(this, str_username, version); 

    // Now we try to open the database with the password from the user. 
    try { 
     dbObj = dbHelperObj.getReadableDatabase(str_password); 

    // The only possible error now must be a wrong password. 
    } catch (Exception e) { 
     dbHelperObj.close(); 

     // Do stuff to tell the user he provided a wrong password. 
    } 
संबंधित मुद्दे

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