मैं SQLCipher for Android का उपयोग कर रहा हूं और यह जांचने का सही तरीका निर्धारित करने का प्रयास कर रहा हूं कि उपयोगकर्ता द्वारा प्रदान किया गया पासवर्ड मान्य है या नहीं।क्या यह जांचने का कोई सही तरीका है कि उपयोगकर्ता द्वारा प्रदत्त SQLCipher पासवर्ड Android पर मान्य है या नहीं?
मेरा पहला झुकाव SQLiteOpenHelper.getReadableDatabase(password)
के SQLCipher कार्यान्वयन का उपयोग करके दिए गए पासवर्ड के साथ डेटाबेस को खोलने और खोलने के लिए था, और फिर SQLiteException
को पॉप आउट करता है।
यह काम करता है, लेकिन समस्या यह है कि एंड्रॉइड एपीआई वास्तव में अंतर्निहित सी कॉल को लपेटती है, यह आपके लिए बहुत काम करता है - विशेष रूप से, जब आप एंड्रॉइड एपीआई का उपयोग कर डेटाबेस खोलते हैं, तो यह डेटाबेस खोलता है , देशी सी-लेवल sqlite3_key
विधि (प्रदान किए गए पासवर्ड के साथ) चलाता है, फिर डेटाबेस पर लोकेल सेट करने का प्रयास करता है, भले ही प्रदान किया गया पासवर्ड सही था या नहीं।
इस बिंदु पर, एंड्रॉइड लाइब्रेरी लोकेल सेट करने का प्रयास करती है, और अंतर्निहित डेटाबेस "एन्क्रिप्टेड या डेटाबेस नहीं" SQLiteException
फेंकता है, जिसे पकड़ा जाता है और पुनर्स्थापित किया जाता है; लेकिन इससे पहले, लॉग में एक असंबंधित त्रुटि लिखा जाता है, अनिवार्य रूप से कह रहा है कि लोकेल सेट नहीं किया जा सकता है और डेटाबेस बंद हो रहा है (एक स्टैक ट्रेस के साथ)। चूंकि यह विशेष रूप से एंड्रॉइड लाइब्रेरी द्वारा लिखा गया है, इसलिए मैं इसे दबा नहीं सकता, लॉग में एक बदसूरत त्रुटि छोड़कर जो वास्तव में मेरी मूल समस्या से संबंधित नहीं है, जो बस गलत पासवर्ड में पारित हुआ था।
क्योंकि एंड्रॉइड लाइब्रेरी सी-स्तरीय कॉल का पर्दाफाश नहीं करती है, इसलिए मैं केवल Testing the Key से संबंधित SQLCipher API दस्तावेज़ में वर्णित विधि का उपयोग नहीं कर सकता, क्योंकि मेरे पास डेटाबेस को सीधे खोलने की पहुंच नहीं है।
मैं SQLiteDatabaseHook
का उपयोग करने की ओर झुकता हूं, लेकिन सबसे अच्छा मैं बता सकता हूं, जो SQLiteOpenHelper
के उपयोग को रोकता है, जो एक हुक सेट करने का तरीका प्रदान नहीं करता है।
क्या किसी और को यह जांचने का कोई बेहतर तरीका पता है कि कोई इनपुट पासफ्रेज़ SQLCipher Android API के माध्यम से SQLCipher डेटाबेस को ठीक से डिक्रिप्ट करता है या नहीं? मैं पूरी तरह से एक विधि को कॉल करने की उम्मीद करता हूं और फेंकने वाले अपवाद की जांच करता हूं - जो मैं नहीं चाहता हूं वह ऑपरेशन के लिए डेटाबेस पर बाहरी प्रसंस्करण (जैसे सेट लोकेल) करने और निष्पादित करने के लिए है और मेरे लॉग में पूरी तरह से अप्रचलित त्रुटि लिखना है।
"...: कम से कम जब मैं इस सवाल का पाया, मैं कुछ कोड कैसे चेक-अप :)
तरह से मैं एंड्रॉयड में यह करने के लिए करते हैं यह देखने के लिए प्यार करता था होता यह हैयह वास्तव में मेरी मूल समस्या से असंबंधित है, जो कि बस गलत पासवर्ड में पारित किया गया था "- नहीं, यह मूल समस्या है: आपने गलत पासवर्ड पारित किया है, यही कारण है कि सेट-लोकेल ऑपरेशन विफल हो गया।" मैं कर सकता हूं कुंजी जांचने के संबंध में SQLCipher API दस्तावेज़ में वर्णित विधि का उपयोग न करें ... "- आपके परिणाम जो आप वर्तमान में प्राप्त कर रहे हैं उसके समान होंगे, सिवाय इसके कि लॉगकैट में किसी भी बाहरी निशान के बिना। इसके अलावा, आपका मानदंड क्या है "किसी भी बेहतर तरीके" के लिए? – CommonsWare
मुझे खेद है कि मैंने स्पष्ट रूप से खुद को स्पष्ट नहीं किया। मैं बस इतना करना चाहता हूं कि मैं गलत पासवर्ड में पास हो गया हूं या नहीं। मैं पूरी तरह से सहमत हूं कि मेरे परिणाम समान होंगे (बनाना कॉल, एक त्रुटि की जांच करें)। "किसी भी बेहतर तरीके" के लिए मेरा मानदंड बाहरी सेटलोकेल प्रसंस्करण और त्रुटि के बिना है। – mWillis
मैं उन्हें त्रुटि लॉग इन नहीं करने के लिए बस एक समस्या दर्ज करूंगा और इसके बारे में चिंता न करें। , मैं एम के लिए sqlcipher Google समूह की सलाह देते हैं अयस्क सहायता – CommonsWare