पासवर्ड एक SQLite DB की रक्षा करें। क्या यह संभव है?


88

मुझे एक नई छोटी परियोजना का सामना करना है। इसमें लगभग 7 या 9 टेबल होंगे, उनमें से सबसे बड़ी एक महीने में 1000 पंक्तियों की अधिकतम दर से बढ़ेगी।

मैंने SQLite के बारे में अपने db के रूप में सोचा ... लेकिन मुझे db से डेटा बदलने के लिए किसी के मामले में db की रक्षा करने की आवश्यकता होगी

मेरा मुख्य प्रश्न है:

क्या यह संभव है कि आप एक साइक्लाइट डीबी की रक्षा करें, क्योंकि आप एक्सेस करेंगे?

इतने छोटे समाधान के लिए आप अन्य आरडीबीएमएस की क्या सलाह देंगे?

विकास C # पर होगा, लेकिन मैं कुछ मुफ्त खोज रहा हूं।




यदि आपको डीबग करने के लिए बार-बार DB को लॉक / अनलॉक करना है, तो इस टूल को आजमाएं। goo.gl/12VnQd
Mangesh

आप इसका समाधान यहां लिंक विवरण दर्ज
ईश्वर रिमल

जवाबों:


73

आप एक SQLite3 DB की रक्षा कर सकते हैं। कोई भी ऑपरेशन करने से पहले पासवर्ड को निम्नानुसार सेट करें।

SQLiteConnection conn = new SQLiteConnection("Data Source=MyDatabase.sqlite;Version=3;");
conn.SetPassword("password");
conn.Open();

फिर अगली बार आप इसे पसंद कर सकते हैं

conn = new SQLiteConnection("Data Source=MyDatabase.sqlite;Version=3;Password=password;");
conn.Open();

यह अभ्यस्त किसी भी जीयूआई संपादक को आपके डेटा को देखने की अनुमति नहीं देता है। यदि आप पासवर्ड प्रदान करते हैं तो कुछ संपादक डीबी को डिक्रिप्ट कर सकते हैं। इस्तेमाल किया एल्गोरिथ्म RSA है।

बाद में यदि आप पासवर्ड बदलना चाहते हैं, तो उपयोग करें

conn.ChangePassword("new_password");

पासवर्ड रीसेट या हटाने के लिए, का उपयोग करें

conn.ChangePassword(String.Empty);

अब तक मैंने जो एकमात्र फ्री टूल पाया है वह पासवर्ड प्रोटेक्टेड डेटाबेस को खोलेगा जैसे कि SQLite2009 प्रो इस उत्तर में विस्तृत है ।
जम्पिंग जेजा

इसका उदाहरण क्या है? .NET जैसा दिखता है?
pim

1
तकनीकी रूप से, .NET फ्रेमवर्क है। C # भाषा यहां प्रदर्शित की जा रही है।
vapcguy

इसके अलावा, आपको हर बार पासवर्ड बदलने से पहले अगली बार कनेक्शन स्ट्रिंग को अपडेट करने में सावधानी बरतनी होगी या आप त्रुटियों का सामना कर सकते हैं: stackoverflow.com/questions/16030601/…
vapcguy

कोई पासवर्ड प्रदान न करने पर, खोलें () पासवर्ड से सुरक्षित SQLite डेटाबेस पर विफल नहीं होगा, जैसा कि आप उम्मीद करेंगे! उस खुली फ़ाइल पर किसी भी बाद के डेटा या मेटाडेटा ऑपरेशन में विफल रहता है।
क्रिस्टी एस।

33

आप sqlite .net प्रदाता (System.Data.SQLite) के अंतर्निहित एन्क्रिप्शन का उपयोग कर सकते हैं। Http://web.archive.org/web/20070813071554/http://sqlite.phxsoftware.com/forums/t/130.aspx पर अधिक विवरण देखें

किसी मौजूदा अनएन्क्रिप्टेड डेटाबेस को एन्क्रिप्ट करने के लिए , या किसी एन्क्रिप्टेड डेटाबेस के पासवर्ड को बदलने के लिए , डेटाबेस को खोलें और फिर SQLiteConnection के ChangePassword () फ़ंक्शन का उपयोग करें:

// Opens an unencrypted database
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3");
cnn.Open();
// Encrypts the database. The connection remains valid and usable afterwards.
cnn.ChangePassword("mypassword");

किसी मौजूदा एन्क्रिप्टेड डेटाबेस कॉल ChangePassword()को पासवर्ड NULLया ""पासवर्ड से डिक्रिप्ट करने के लिए :

// Opens an encrypted database
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3;Password=mypassword");
cnn.Open();
// Removes the encryption on an encrypted database.
cnn.ChangePassword(null);

एक मौजूदा एन्क्रिप्टेड डेटाबेस को खोलने के लिए, या एक नया एन्क्रिप्टेड डेटाबेस बनाने के ConnectionStringलिए, पिछले उदाहरण में दिखाए गए अनुसार एक पासवर्ड निर्दिष्ट करें, या SetPassword()एक नया खोलने से पहले फ़ंक्शन को कॉल करें SQLiteConnection। निर्दिष्ट पासवर्ड स्पष्ट होने ConnectionStringचाहिए, लेकिन SetPassword()फ़ंक्शन में दिए गए पासवर्ड बाइनरी बाइट सरणियाँ हो सकते हैं।

// Opens an encrypted database by calling SetPassword()
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3");
cnn.SetPassword(new byte[] { 0xFF, 0xEE, 0xDD, 0x10, 0x20, 0x30 });
cnn.Open();
// The connection is now usable

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

यदि आप क्लीयरटेक्स्ट पासवर्ड का उपयोग कर एन्क्रिप्टेड डेटाबेस संलग्न कर रहे हैं:

// Attach to a database using a different key than the main database
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3");
cnn.Open();
cmd = new SQLiteCommand("ATTACH DATABASE 'c:\\pwd.db3' AS [Protected] KEY 'mypassword'", cnn);
cmd.ExecuteNonQuery();

एक द्विआधारी पासवर्ड का उपयोग कर एक एन्क्रिप्टेड डेटाबेस संलग्न करने के लिए:

// Attach to a database encrypted with a binary key
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3");
cnn.Open();
cmd = new SQLiteCommand("ATTACH DATABASE 'c:\\pwd.db3' AS [Protected] KEY X'FFEEDD102030'", cnn);
cmd.ExecuteNonQuery();

2
यह लिंक-ओनली-उत्तर वास्तव में एक स्पष्ट उदाहरण है कि हम SO पर केवल लिंक-उत्तर क्यों नहीं करते हैं। वास्तविक लिंक चला गया है; यह अब मौजूद नहीं है। एकमात्र कारण जो हम साइट को देख पा रहे हैं, क्योंकि यह web.archive.org द्वारा स्वचालित रूप से संग्रहीत किया गया था।
हैनलेट एस्केनो

यह अब काम नहीं करता है, नवीनतम संस्करणों में ऐसा कोई फ़ंक्शन नहीं मिला है।
१२:२२ पर MindRoasterMir

12

SQLCipher का उपयोग करें, यह SQLite के लिए एक ओपनसोर्स एक्सटेंशन है जो डेटाबेस फ़ाइलों का पारदर्शी 256-बिट एईएस एन्क्रिप्शन प्रदान करता है। http://sqlcipher.net


1
गति के बारे में कैसे? यदि मैं sqlcipher का उपयोग करता हूं तो क्या यह प्रदर्शन को कम करेगा?
टॉमस्वर जू

6

आप अपने SQLite डेटाबेस को SEE एडऑन के साथ एन्क्रिप्ट कर सकते हैं। इस तरह आप अनधिकृत पहुँच / संशोधन को रोकते हैं।

SQLite प्रलेखन उद्धृत:

SQLite एन्क्रिप्शन एक्सटेंशन (SEE) SQLite का एक उन्नत संस्करण है जो अनाधिकृत उपयोग या संशोधन को रोकने में मदद करने के लिए 128-बिट या 256-बिट एईएस का उपयोग करके डेटाबेस फ़ाइलों को एन्क्रिप्ट करता है। संपूर्ण डेटाबेस फ़ाइल को एन्क्रिप्ट किया गया है ताकि बाहरी पर्यवेक्षक के पास, डेटाबेस फ़ाइल में सफेद शोर हो। कुछ भी नहीं है जो फ़ाइल को SQLite डेटाबेस के रूप में पहचानता है।

आप इस लिंक के बारे में अधिक जानकारी इस लिंक पर पा सकते हैं ।


7
यह विस्तार साइक्लाइट में एक भुगतान किया गया एडऑन भी है।
जॉन बोकर

3

एक विकल्प VistaDB होगा । वे डेटाबेस (या यहां तक ​​कि टेबल) को पासवर्ड संरक्षित (और वैकल्पिक रूप से एन्क्रिप्टेड) ​​करने की अनुमति देते हैं।


1
अधिक कुशल और मुक्त तरीके हैं!
सावन

1
@MSS लेकिन - जैसा कि मैंने कहा, पूर्ण DB कनेक्शन एन्क्रिप्शन के बजाय टेबल स्तर पर अलग एन्क्रिप्शन सहित VistaDB समाधान के कुछ फायदे हैं। मुझे पता है कोई अन्य .NET नेटिव विकल्प जो इसे पूरा करता है। यह अधिकांश अन्य विकल्पों के विपरीत भी शुद्ध प्रबंधित है - सिर्फ इसलिए कि यह मुफ़्त नहीं है इसका मतलब यह नहीं है कि अधिक कुशल या बेहतर विकल्प हैं - यह पूरी तरह से उपयोग की आवश्यकताओं पर निर्भर करता है।
रीड कोपसे

3

पासवर्ड के बारे में आपके प्रश्न के लिए आपके साइक्लाइट db की सुरक्षा करना, मुझे नहीं लगता कि यह किया जा सकता है।

यद्यपि आप इसे एन्क्रिप्ट कर सकते हैं, यहाँ उस पर कुछ जानकारी दी गई है:

http://sqlcrypt.com/

यह प्रति प्लेटफॉर्म $ 149 है।


3

यदि आप FluentNHibernate का उपयोग करते हैं, तो आप निम्न कॉन्फ़िगरेशन कोड का उपयोग कर सकते हैं:

private ISessionFactory createSessionFactory()
{
    return Fluently.Configure()
            .Database(SQLiteConfiguration.Standard.UsingFileWithPassword(filename, password))
            .Mappings(m => m.FluentMappings.AddFromAssemblyOf<DBManager>())
            .ExposeConfiguration(this.buildSchema)
            .BuildSessionFactory();    
}

private void buildSchema(Configuration config)
{
        if (filename_not_exists == true)
        {
            new SchemaExport(config).Create(false, true);
        }
}    

विधि UseFileWithPassword (फ़ाइल नाम, पासवर्ड) एक डेटाबेस फ़ाइल को एन्क्रिप्ट करता है और पासवर्ड सेट करता है।
यह तभी चलता है जब नई डेटाबेस फ़ाइल बनाई जाती है। इस विधि से खोले जाने पर पुराना एन्क्रिप्टेड फेल नहीं होता है।


2

मुझे पता है कि यह एक पुराना सवाल है, लेकिन ओएस स्तर पर फ़ाइल की सुरक्षा के लिए सरल समाधान नहीं होगा? बस उपयोगकर्ताओं को फ़ाइल तक पहुँचने से रोकना चाहिए और फिर उन्हें इसे छूने में सक्षम नहीं होना चाहिए। यह सिर्फ एक अनुमान है और मुझे यकीन नहीं है कि यह एक आदर्श समाधान है।


2
मुझे यकीन नहीं है कि अगर यह एक अच्छा समाधान है, क्योंकि यूएसबी स्टिक वाला कोई अन्य ओएस में बूट कर सकता है और फाइलें पढ़ सकता है।
नुरेटिन

मुझे लगता है कि यह उचित संकेत है, लेकिन फिर उस स्थिति में यूएसबी को अक्षम करें। यदि कुछ को आपकी मशीन तक भौतिक पहुँच प्राप्त है तो बहुत सी अन्य चीजें हैं जो की जा सकती हैं।
डेविड प्राइस

आप संवेदनशील डेटा को सुरक्षित रखना चाहते हैं ताकि केवल वे अन्य चीजें गलत हो जाएं।
tripleee

SQLite डेटाबेस के साथ, यह वास्तव में बिल्कुल संभव नहीं है। आपको उपयोगकर्ताओं को दोनों को पढ़ने और लिखने में सक्षम बनाने की आवश्यकता है, जिसका अर्थ उस फ़ोल्डर का ACL है जहां SQLite DB को उन अनुमतियों को भी अनुमति देना है। आप गैर-उपयोगकर्ताओं के खिलाफ इसे केवल उस फ़ोल्डर में वास्तविक उपयोगकर्ताओं की अनुमति देकर सुरक्षित कर सकते हैं, लेकिन आपके पास अभी भी "इनसाइडर खतरा" है।
vapcguy

1

आपको डेटाबेस को एन्क्रिप्ट करने की आवश्यकता क्यों है? उपयोगकर्ता आसानी से आपके प्रोग्राम को अलग कर सकता है और कुंजी का पता लगा सकता है। यदि आप इसे नेटवर्क स्थानांतरण के लिए एन्क्रिप्ट कर रहे हैं, तो एक एन्क्रिप्शन परत को डेटाबेस लेयर में निचोड़ने के बजाय PGP का उपयोग करने पर विचार करें।


6
उपयोगकर्ता को पासवर्ड के लिए कहा जा सकता है, इसलिए कोई भी कुंजी कार्यक्रम को नष्ट करने से प्राप्त नहीं होगी।
किलोडे 18

1
Redgate परावर्तक, या ILSpy का उपयोग करें।
ज़ेव स्पिट्ज़

4
आप कार्यक्रम में कुंजी क्यों रखेंगे? आप ऐसा नहीं करेंगे, उपयोगकर्ताओं के पासवर्ड से एक कुंजी उत्पन्न करें और उसका उपयोग करें, फिर आपको अपने स्रोत कोड में किसी भी रहस्य की आवश्यकता नहीं है।
ट्रैम्पस्टर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.