एन्क्रिप्शन / पासवर्ड सुरक्षा के साथ SQLite


136

मैं सिर्फ SQLite का उपयोग करना सीख रहा हूं और अगर ऐसा संभव है तो मैं उत्सुक था:

  1. डेटाबेस फ़ाइल का एन्क्रिप्शन?

  2. पासवर्ड डेटाबेस के उद्घाटन की रक्षा?

पुनश्च। मुझे पता है कि यह "SQLite एन्क्रिप्शन एक्सटेंशन (SEE)" है, लेकिन प्रलेखन के अनुसार, "SEE लाइसेंस प्राप्त सॉफ़्टवेयर है ...." और "SEE के लिए एक स्थायी स्रोत कोड लाइसेंस की लागत यूएस $ 2000 है।"


यह निश्चित रूप से संभव है और एसईई के अलावा कई खुले स्रोत समाधान मौजूद हैं। उनमें से wxSQLite3 के साथ आने वाला एन्क्रिप्शन एक्सटेंशन है। विवरण के लिए एक समान प्रश्न के लिए मेरा उत्तर देखें।
उलरिच टेल्ले

1
@RobotMess: आपके साथ ईमानदार होना - इनमें से कोई भी यहां सूचीबद्ध नहीं है। मेरे पास उस प्रोजेक्ट पर सख्त समय की कमी थी, इसलिए मुझे कुछ जल्दी करना था। मैं डीबी में रखने से पहले कच्चे डेटा पर जो सबसे अच्छा जानता था - एईएस के साथ गया था ... यह लुकअप, खोज और डीबी प्रबंधन के संदर्भ में बहुत कुशल नहीं है।
अहम् ०

@ ahmd0 हम्म, कि हालांकि DB की तरह बेकार नहीं है? मेरा मतलब है, यह सब वास्तव में अब सुनिश्चित करता है कि कमिट परमाणु हैं।
नवीन

हाँ, यह मुमकिन है। यदि लक्ष्य .Net मानक 4.6.1+ या कोर, तो मुझे लगता है कि Sqlite एन्क्रिप्शन प्राप्त करने के लिए एक काफी सरल है । मेरे जवाब के अनुसार Microsoft.Data.Sqlite का उपयोग करें
पावेलब

जवाबों:


110

SQLite में हुक इन-इन एन्क्रिप्शन है जो सामान्य वितरण में उपयोग नहीं किया जाता है, लेकिन यहां कुछ कार्यान्वयन हैं जिन्हें मैं जानता हूं:

  • एसईई - आधिकारिक कार्यान्वयन।
  • wxSQLite - एक wxWidgets स्टाइल C ++ रैपर जो SQLite के एन्क्रिप्शन को भी लागू करता है।
  • SQLCipher - कार्यान्वित करने के लिए ओपनएसएसएल के libcrypto का उपयोग करता है।
  • SQLiteCrypt - कस्टम कार्यान्वयन, संशोधित एपीआई।
  • botansqlite3 - botansqlite3 SQLite3 के लिए एक एन्क्रिप्शन कोडक है जो एन्क्रिप्शन के लिए बॉटन में किसी भी एल्गोरिदम का उपयोग कर सकता है।
  • sqleet - ChaCha20 / Poly1305 आदिम का उपयोग करते हुए एक और एन्क्रिप्शन कार्यान्वयन। ध्यान दें कि ऊपर उल्लिखित wxSQLite एक क्रिप्टो प्रदाता के रूप में इसका उपयोग कर सकता है।

एसईई और SQLiteCrypt एक लाइसेंस की खरीद की आवश्यकता है।

प्रकटीकरण: मैंने botansqlite3 बनाया।


1
क्या आपके पास SQLite डेटाबेस एन्क्रिप्शन के लिए How-To-Use Botan का कोई प्रलेखन है? बॉटन वेब साइट इस सुविधा का उल्लेख नहीं करती है।
मार्क श्लोसर

5
botansqlite3 अब बोटन के स्वतंत्र रूप से वितरित किया जाता है।
OliJG

1
लिटरप्लिका भी है । यह एआरएम 7 पर आधारित पोर्टेबल उपकरणों पर एईएस की तुलना में तेज, चौका सिफर का उपयोग करता है
बर्नार्डो रामोस

SQLite3 .Net अब एन्क्रिप्शन के समर्थन में बनाया गया है, जो काफी हद तक इस उत्तर को अमान्य करता है।
Krythic

21

आप 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();

यह किसी भी जीयूआई संपादक को आपका डेटा देखने की अनुमति नहीं देगा। बाद में यदि आप पासवर्ड बदलना चाहते हैं, तो पासवर्ड conn.ChangePassword("new_password"); रीसेट या हटाने के लिए उपयोग करेंconn.ChangePassword(String.Empty);


16
ओपन सोर्स स्केलाइट के साथ काम नहीं करेंगे। भाषा का कार्यान्वयन, भाषा, या एपीआई यह क्या होना चाहिए, इसका कोई सुराग नहीं है।
mikerobi

1
मुझे कैसे पता चलेगा कि कौन सा एन्क्रिप्शन तरीका ChangePasswordउपयोग किया गया है? एईएस 128? RSA ..?
क्कमाकक १४'१५

1
RSA 1024 या 2048? क्या कोई दस्तावेज देख सकता है कि अधिक विवरण?
काकमाक

यहां से डॉक्स प्राप्त करें system.data.sqlite.org/index.html/doc/trunk/www/index.wiki
मंगेश

अपने स्वयं के परीक्षण में, मैंने पाया है कि SetPasswordविधि (इस समय) मूल रूप से बेकार लगती है। जिस तरह से मैं System.Data.SQLiteइस ChangePasswordविधि का उपयोग करके पासवर्ड को ठीक से लागू करने के लिए पुस्तकालय को प्राप्त करने में सक्षम था । उपयोग करना SetPassword( विधि को कॉल करने से पहलेOpen , जैसा कि पुस्तकालय द्वारा स्पष्ट रूप से आवश्यक है), मैं अभी भी किसी भी पासवर्ड के बिना SQLiteStudio में DB को खोलने और संपादित करने में सक्षम था। यह तब तक नहीं था जब तक कि मैं ChangePasswordविधि का उपयोग नहीं करता (विधि को कॉल करने के बादOpen ) कि पासवर्ड एप्लिकेशन वास्तव में "अटक गया"।
G_Hosa_Phat

15

.Net पुस्तकालय System.Data.SQLite एन्क्रिप्शन के लिए भी प्रदान करता है।


8
ASP.NET! = SQL सर्वर! = SQL सर्वर का स्थापित उदाहरण
Zev Spitz

1
लेकिन System.Data.SQLite Microsoft से नहीं है। यह सवाल .Net के बारे में नहीं है, लेकिन अगर यह होता तो अन्य कॉम्पिटिशन और असंगतताएँ महत्वपूर्ण होतीं।
user34660

7

आप http://system.data.sqlite.org/sqlite3.dll से एन्क्रिप्शन समर्थन के साथ फ़ाइल प्राप्त कर सकते हैं

1 - http://system.data.sqlite.org/index.html/doc/trunk/www/ds.s.siki पर जाएं और एक पैकेज डाउनलोड करें। .NET का संस्करण यहाँ अप्रासंगिक है।

2 - SQLite.Interop.dllपैकेज से निकालें और इसका नाम बदलें sqlite3.dll। यह DLL सादा पासवर्ड या एन्क्रिप्शन कुंजी के माध्यम से एन्क्रिप्शन का समर्थन करता है।

उल्लिखित फ़ाइल मूल है और इसके लिए .NET फ्रेमवर्क की आवश्यकता नहीं है। आपके द्वारा डाउनलोड किए गए पैकेज के आधार पर इसे विजुअल C ++ रनटाइम की आवश्यकता हो सकती है।

अपडेट करें

यह वह पैकेज है जिसे मैंने 32-बिट विकास के लिए डाउनलोड किया है: http://system.data.sqlite.org/blobs/1.0.94.0/sqlite-netFx40-static-binary-Win32-20105.0.94.0.zip


मेरे विशेष उदाहरण में मुझे एक जरूरत थी .libकि मैं अपने निष्पादन योग्य में एम्बेड कर सकूं। मैं कोई dlls नहीं कर सकता था।
ahmd0

2
कृपया इस एक github.com/rindeal/wxSQLite3-VS को भी देखें जो आपको एक libऔर dllफाइल देगा।
मोहम्मद बानसीद

4

ध्यान रखें, निम्नलिखित एक उचित सुरक्षा समाधान का विकल्प नहीं है।

चार दिनों के लिए इस के साथ खेलने के बाद, मैंने NuGet से केवल ओपन सोर्स System.Data.SQLite पैकेज का उपयोग करके एक साथ रखा है। मैं नहीं जानता कि यह कितना सुरक्षा प्रदान करता है। मैं केवल अध्ययन के अपने पाठ्यक्रम के लिए इसका उपयोग कर रहा हूं। यह डीबी बनाएगा, इसे एन्क्रिप्ट करेगा, एक टेबल बनाएगा, और डेटा जोड़ेगा।

using System.Data.SQLite;

namespace EncryptDB
{
    class Program
    {
        static void Main(string[] args)
        {
            string connectionString = @"C:\Programming\sqlite3\db.db";
            string passwordString = "password";
            byte[] passwordBytes = GetBytes(passwordString);
            SQLiteConnection.CreateFile(connectionString);
            SQLiteConnection conn = new SQLiteConnection("Data Source=" + connectionString + ";Version=3;");
            conn.SetPassword(passwordBytes);
            conn.Open();
            SQLiteCommand sqlCmd = new SQLiteCommand("CREATE TABLE data(filename TEXT, filepath TEXT, filelength INTEGER, directory TEXT)", conn);
            sqlCmd.ExecuteNonQuery();
            sqlCmd = new SQLiteCommand("INSERT INTO data VALUES('name', 'path', 200, 'dir')", conn);
            sqlCmd.ExecuteNonQuery();
            conn.Close();
        }
        static byte[] GetBytes(string str)
        {
            byte[] bytes = new byte[str.Length * sizeof(char)];
            bytes = System.Text.Encoding.Default.GetBytes(str);
            return bytes;
        }
    }
}

वैकल्पिक रूप से, आप इसे हटा सकते हैं conn.SetPassword(passwordBytes);और इसे बदल सकते हैं conn.ChangePassword("password");जिसके बाद इसे रखने की आवश्यकता हैconn.Open(); पहले के बजाय । तब आपको गेटबाइट विधि की आवश्यकता नहीं होगी।

डिक्रिप्ट करने के लिए, कॉल खोलने से पहले अपने कनेक्शन स्ट्रिंग में पासवर्ड डालने की बात है।

        string filename = @"C:\Programming\sqlite3\db.db";
        string passwordString = "password";
        SQLiteConnection conn = new SQLiteConnection("Data Source=" + filename + ";Version=3;Password=" + passwordString + ";");
        conn.Open();

2
"I think I saw 128 bit somewhere"- यदि आप एन्क्रिप्शन से निपटने की योजना बना रहे हैं तो यह बहुत बुरा कथन है। अंगूठे का नियम यह है कि यदि आप इसे नहीं समझते हैं तो आप इसे कभी नहीं करेंगे। अन्यथा आप इसका उपयोग नहीं करना बेहतर समझेंगे।
ahmd0

में तुम्हारी बात समझ रहा हूँ। मैं ज्यादातर उस सलाह को सही करने की कोशिश कर रहा था जो मैं देख रहा हूं कि System.Data.Sqlite के वर्तमान संस्करण के साथ काम नहीं करता है। मेरा मतलब यह नहीं था कि यह अच्छी सुरक्षा थी। मैंने अपनी पोस्ट अपडेट कर दी है। इनपुट के लिए धन्यवाद!
माइक वार्नर

2

आप हमेशा क्लाइंट की तरफ डेटा एन्क्रिप्ट कर सकते हैं। कृपया ध्यान दें कि सभी डेटा को एन्क्रिप्ट नहीं करना है क्योंकि इसमें एक प्रदर्शन समस्या है।


1

खैर, SEEमहंगा है। हालांकि SQLiteइंटरफेस इन-एन्क्रिप्शन (पेजर) के लिए है। इसका मतलब है, मौजूदा कोड के शीर्ष पर कोई आसानी से कुछ एन्क्रिप्शन तंत्र विकसित कर सकता है, होना जरूरी नहीं है AES। सच में कुछ भी। कृपया मेरी पोस्ट यहाँ देखें: https://stackoverflow.com/a/49161716/9418360

पेजर एन्क्रिप्शन को सक्षम करने के लिए आपको SQLITE_HAS_CODEC = 1 को परिभाषित करना होगा। नमूना कोड नीचे (मूल SQLiteस्रोत):

#ifdef SQLITE_HAS_CODEC
/*
** This function is called by the wal module when writing page content
** into the log file.
**
** This function returns a pointer to a buffer containing the encrypted
** page content. If a malloc fails, this function may return NULL.
*/
SQLITE_PRIVATE void *sqlite3PagerCodec(PgHdr *pPg){
  void *aData = 0;
  CODEC2(pPg->pPager, pPg->pData, pPg->pgno, 6, return 0, aData);
  return aData;
}
#endif

एईएस 256 का उपयोग करके एन्क्रिप्शन के C languageलिए एक व्यावसायिक संस्करण है SQLite- यह भी काम कर सकता है PHP, लेकिन इसे PHPऔर SQLiteविस्तार के साथ संकलित करने की आवश्यकता है । यह SQLiteउड़ने पर डेटाबेस फ़ाइल को डी / एनक्रिप्ट करता है, फ़ाइल सामग्री हमेशा एन्क्रिप्ट की जाती है। बहुत उपयोगी।

http://www.iqx7.com/products/sqlite-encryption


0

आप SQLite के फ़ंक्शन निर्माण रूटीन ( PHP मैनुअल ) का उपयोग कर सकते हैं :

$db_obj->sqliteCreateFunction('Encrypt', 'MyEncryptFunction', 2);
$db_obj->sqliteCreateFunction('Decrypt', 'MyDecryptFunction', 2);

डेटा सम्मिलित करते समय, आप सीधे एन्क्रिप्शन फ़ंक्शन का उपयोग कर सकते हैं और एन्क्रिप्ट किए गए डेटा को सम्मिलित कर सकते हैं या आप कस्टम फ़ंक्शन का उपयोग कर सकते हैं और अनएन्क्रिप्टेड डेटा पास कर सकते हैं:

$insert_obj = $db_obj->prepare('INSERT INTO table (Clear, Encrypted) ' .
 'VALUES (:clear, Encrypt(:data, "' . $passwordhash_str . '"))');

डेटा पुनर्प्राप्त करते समय, आप SQL खोज कार्यक्षमता का उपयोग भी कर सकते हैं:

$select_obj = $db_obj->prepare('SELECT Clear, ' .
 'Decrypt(Encrypted, "' . $passwordhash_str . '") AS PlainText FROM table ' .
 'WHERE PlainText LIKE :searchterm');
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.