मैं अपने मौजूदा अनएन्क्रिप्टेड डेटाबेस के साथ SQLCipher को मूल रूप से कैसे एकीकृत कर सकता हूं, ताकि मेरा ऐप सामान्य रूप से काम करे लेकिन अब डेटाबेस एन्क्रिप्टेड हैं?
आप नहीं। अन्य बातों के अलावा, आपको उपयोगकर्ता से पासफ़्रेज़ के लिए पूछने के लिए अपने UI को समायोजित करना होगा, और यह सुनिश्चित करना होगा कि आप आवश्यकतानुसार उस पासफ़्रेज़ के लिए पूछ सकते हैं (उदाहरण के लिए, उपयोगकर्ता किसी "आंतरिक" गतिविधि से एक कार्य को फिर से शुरू करता है, न कि केवल जब उपयोगकर्ता आपका चलाता है लॉन्चर आइकन के माध्यम से ऐप)।
<ब्लॉकक्वॉट>मुझे इस पर एक छोटा ट्यूटोरियल चाहिए
सबसे पहले, यह नहीं है कि स्टैक ओवरफ़्लो कैसे काम करता है।
दूसरा, Android के लिए SQLCipher का अच्छा कवरेज बहुत लेता है एक से अधिक स्टैक ओवरफ़्लो उत्तर में फिट हो सकता है। उदाहरण के लिए, मेरी किताब में इस विषय पर एक 18-पृष्ठ का अध्याय है। यह उत्तर पहले से ही अधिकांश Android प्रश्नों से लंबा है, और मैं इस प्रश्न को बहुत व्यापक होने के कारण बंद करने के लिए लोगों को दोष नहीं दूंगा।
<ब्लॉकक्वॉट>मुझे कैसे जांचना चाहिए कि डेटाबेस अनएन्क्रिप्टेड है या नहीं
""
. के साथ Android कक्षाओं के लिए SQLCipher का उपयोग करके इसे खोलने का प्रयास करें पासफ़्रेज़ के रूप में। यदि यह सफलतापूर्वक खुलता है, तो डेटाबेस अनएन्क्रिप्टेड है। यदि वह विफल हो जाता है, तो या तो डेटाबेस दूषित या एन्क्रिप्टेड है, और उचित पासफ़्रेज़ के बिना, आप अंतर नहीं बता सकते।
मैं इसे कैसे एन्क्रिप्ट कर सकता हूं?
मूल दृष्टिकोण है:
-
अनएन्क्रिप्टेड डेटाबेस खोलें
-
ATTACH
का उपयोग करें नए एन्क्रिप्टेड डेटाबेस के रूप में काम करने के लिए एक खाली फ़ाइल संलग्न करने के लिए SQL कथन, आपके वांछित पासफ़्रेज़ की आपूर्ति, और संलग्न डेटाबेस का नामकरणencrypted
आपके डेटाबेस सत्र के भीतर -
SELECT sqlcipher_export('encrypted')
the चलाएँ खुले (अनएन्क्रिप्टेड) डेटाबेस में, जो अनएन्क्रिप्टेड डेटाबेस से डेटा को एन्क्रिप्टेड में निर्यात करेगा (डेटाबेस स्कीमा संस्करण के अपवाद के साथ, जिसे बाद के चरणों में संभाला जाता है) -
कॉल करें
getVersion()
खुले (अनएन्क्रिप्टेड) डेटाबेस पर और उस मान को थोड़ी देर के लिए पकड़ कर रखें -
अनएन्क्रिप्टेड डेटाबेस को बंद करें
-
अपने पासफ़्रेज़ का उपयोग करके एन्क्रिप्टेड डेटाबेस खोलें
-
setVersion()
Call पर कॉल करें एन्क्रिप्टेड डेटाबेस पर,getVersion()
. से आपके द्वारा कैश किए गए मान की आपूर्ति करते हुए अनएन्क्रिप्टेड डेटाबेस का -
एन्क्रिप्टेड डेटाबेस बंद करें
-
यदि वांछित है, तो अनएन्क्रिप्टेड डेटाबेस को हटा दें और एन्क्रिप्ट किए गए डेटाबेस को अब-हटाए गए अनएन्क्रिप्टेड के नाम पर पुनर्नामित करें, ताकि आपका रूपांतरण जगह पर हो
यह उपयोगिता पद्धति उपरोक्त दृष्टिकोण को लागू करती है:
public static void encrypt(Context ctxt, String dbName,
String passphrase) throws IOException {
File originalFile=ctxt.getDatabasePath(dbName);
if (originalFile.exists()) {
File newFile=
File.createTempFile("sqlcipherutils", "tmp",
ctxt.getCacheDir());
SQLiteDatabase db=
SQLiteDatabase.openDatabase(originalFile.getAbsolutePath(),
"", null,
SQLiteDatabase.OPEN_READWRITE);
db.rawExecSQL(String.format("ATTACH DATABASE '%s' AS encrypted KEY '%s';",
newFile.getAbsolutePath(), passphrase));
db.rawExecSQL("SELECT sqlcipher_export('encrypted')");
db.rawExecSQL("DETACH DATABASE encrypted;");
int version=db.getVersion();
db.close();
db=
SQLiteDatabase.openDatabase(newFile.getAbsolutePath(),
passphrase, null,
SQLiteDatabase.OPEN_READWRITE);
db.setVersion(version);
db.close();
originalFile.delete();
newFile.renameTo(originalFile);
}
}
पूर्ण प्रकटीकरण के हित में, मैंने कुछ समय से यह कोशिश नहीं की है, और इसलिए इसमें कुछ बदलाव करने की आवश्यकता हो सकती है।
<ब्लॉकक्वॉट>क्या मुझे यह केवल एक बार करना चाहिए?
इसका उत्तर केवल आप ही दे सकते हैं, क्योंकि यहां किसी को भी आपके ऐप के बारे में अधिक जानकारी नहीं होगी।
<ब्लॉकक्वॉट>जब मैं अपने मौजूदा अनएन्क्रिप्टेड डेटाबेस को एन्क्रिप्ट करता हूं, तो क्या SQLCipher एक नया डेटाबेस बनाता है?
हाँ।
<ब्लॉकक्वॉट>अगर हाँ, तो मुझे इस नए का प्रबंधन कैसे करना चाहिए?
इसका उत्तर केवल आप ही दे सकते हैं, क्योंकि यहां किसी को भी आपके ऐप के बारे में अधिक जानकारी नहीं होगी।
<ब्लॉकक्वॉट>और मेरे पुराने डेटाबेस के बारे में क्या जो अनएन्क्रिप्टेड है? क्या यह अब भी वहीं रहता है?
हां, हालांकि जब आपका काम पूरा हो जाए तो इसे हटाने के लिए आपका स्वागत है।