Şifreleme / şifre korumalı SQLite


136

Sadece SQLite kullanmayı öğreniyorum ve bunun mümkün olup olmadığını merak ettim:

  1. Veritabanı dosyasının şifrelenmesi?

  2. Parola korumak veritabanı açılış?

PS. Bu "SQLite Şifreleme Uzantısı (SEE)" olduğunu biliyorum, ancak "SEE lisanslı yazılım ...." ve "SEE için kalıcı kaynak kodu lisansının maliyeti 2000 ABD dolarıdır" belgelerine göre.


Kesinlikle mümkün ve SEE'nin yanı sıra birkaç açık kaynaklı çözüm var. Bunlar arasında wxSQLite3 ile gelen şifreleme uzantısı. Ayrıntılar için benzer bir soruya verdiğim cevaba bakınız.
Ulrich Telle

1
@RobotMess: Size karşı dürüst olmak gerekirse - burada listelenenlerden hiçbiri. Bu projede sıkı zaman kısıtlamaları vardı, bu yüzden hızlı bir şeyler yapmak zorunda kaldım. En iyi bildiklerimle gittim - DB'ye yerleştirmeden önce ham verilerde AES ... Arama, arama ve DB yönetimi açısından çok verimli değil.
ahmd0

@ ahmd0 Hm, DB'yi işe yaramaz hale getirmiyor mu? Yani, şu an gerçekten yaptığı tek şey taahhütlerin atomik olmasını sağlamak.
Navin

Evet mümkün. Hedeflemesi Net Standart 4.6.1+ veya Çekirdek, ben oldukça basit olsun düşünürsek SQLite şifreleme benim Yanıt başına Microsoft.Data.Sqlite kullanmaktır burada .
paulyb

Yanıtlar:


110

SQLite, normal dağıtımda kullanılmayan şifreleme için yerleşik kancalara sahiptir, ancak burada bildiğim birkaç uygulama var:

  • SEE - Resmi uygulama.
  • wxSQLite - SQLite şifrelemesini de uygulayan bir wxWidgets tarzı C ++ sarmalayıcısı.
  • SQLCipher - Uygulamak için openSSL'nin libcrypto'unu kullanır.
  • SQLiteCrypt - Özel uygulama, değiştirilmiş API.
  • botansqlite3 - botansqlite3 SQLite3 için şifreleme için Botan'daki herhangi bir algoritmayı kullanabilen bir şifreleme kodekidir.
  • sqleet - ChaCha20 / Poly1305 ilkellerini kullanan başka bir şifreleme uygulaması. Yukarıda belirtilen wxSQLite'ın bunu bir kripto sağlayıcı olarak kullanabileceğini unutmayın.

SEE ve SQLiteCrypt bir lisans satın alınmasını gerektirir.

Açıklama: Botansqlite3 oluşturdum.


1
SQLite veritabanı şifrelemesi için Nasıl Kullanılır Botan dokümanınız var mı? Botan web sitesinde bu özellikten bahsedilmiyor.
Marc Schlösser

5
botansqlite3 artık Botan'dan bağımsız olarak dağıtılmaktadır.
OliJG

1
Ayrıca litereplica var . ARMv7 tabanlı taşınabilir cihazlarda ChaCha şifresini kullanır, AES'den daha hızlıdır
Bernardo Ramos

SQLite3 .Net, şimdi bu cevabı büyük ölçüde geçersiz kılan şifreleme için yerleşik destek olarak.
Krythic

21

SQLite3 DB'yi parola ile koruyabilirsiniz. Herhangi bir işlem yapmadan önce ilk kez şifreyi aşağıdaki gibi ayarlayın.

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

bir dahaki sefere aşağıdaki gibi erişebilirsiniz

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

Bu, herhangi bir GUI düzenleyicisinin Verilerinizi görüntülemesine izin vermez. Daha sonra şifreyi değiştirmek isterseniz tuşunu kullanın. conn.ChangePassword("new_password"); Şifreyi sıfırlamak veya kaldırmak için tuşunu kullanın.conn.ChangePassword(String.Empty);


16
Açık kaynak kodlu Sqlite ile çalışmaz. Bunun hangi dil uygulaması, dil veya API olması gerektiği hakkında hiçbir fikrim yok.
mikerobi

1
Hangi şifreleme yolunun ChangePasswordkullanıldığını nasıl bilebilirim ? AES 128? RSA ..?
qakmak

1
RSA 1024 veya 2048? Daha fazla ayrıntı görebilecek herhangi bir belge var mı?
qakmak


Kendi testlerimde, SetPasswordyöntemin (şu anda) temel olarak işe yaramaz göründüğünü buldum . System.Data.SQLiteKitaplığı doğru bir şekilde parolayı uygulamak için alabilmemin tek yolu ChangePasswordyöntemi kullanmaktı . Kullanarak SetPassword( yöntemi çağırmadan önceOpen , kütüphanenin gerektirdiği gibi), hala SQLiteStudio'da herhangi bir şifre olmadan DB'yi açıp düzenleyebildim. Ben ChangePasswordyöntemi (yöntem çağırdıktan sonra) kullanılana kadar Openşifre uygulaması aslında "sıkışmış" değildi.
G_Hosa_Phat


7

Sen alabilirsiniz sqlite3.dlldan şifreleme desteği ile dosyayı http://system.data.sqlite.org/ .

1 - http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki adresine gidin ve paketlerden birini indirin. .NET sürümü burada önemsizdir.

2 - SQLite.Interop.dllPaketten çıkarın ve yeniden adlandırın sqlite3.dll. Bu DLL, düz metin parolalar veya şifreleme anahtarları üzerinden şifrelemeyi destekler.

Bahsedilen dosya yerli ve yok DEĞİL NET çerçeve gerektirmektedir. İndirdiğiniz pakete bağlı olarak Visual C ++ Çalışma Zamanı Modülü gerekebilir.

GÜNCELLEME

32 bit geliştirme için indirdiğim paket: http://system.data.sqlite.org/blobs/1.0.94.0/sqlite-netFx40-static-binary-Win32-2010-1.0.94.0.zip


Özel .libörneğimde, çalıştırılabilir dosyama yerleştirebileceğim bir şeye ihtiyacım vardı . Ben herhangi bir dll olamazdı.
ahmd0

2
Lütfen bunu bir ve dosya verecek olan github.com/rindeal/wxSQLite3-VS adresini de kontrol edin . libdll
Mohammad Banisaeid

4

Unutmayın, aşağıdakiler uygun bir güvenlik çözümünün yerine geçmez.

Dört gün boyunca bununla oynadıktan sonra, NuGet'in sadece açık kaynaklı System.Data.SQLite paketini kullanarak bir çözüm oluşturdum. Bunun ne kadar koruma sağladığını bilmiyorum. Sadece kendi dersim için kullanıyorum. Böylece DB oluşturulur, şifrelenir, tablo oluşturulur ve veri eklenir.

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;
        }
    }
}

İsteğe bağlı olarak, kaldırabilir conn.SetPassword(passwordBytes);ve daha önce yerine conn.ChangePassword("password");yerleştirilmesi gereken ile değiştirebilirsiniz conn.Open();. O zaman GetBytes yöntemine ihtiyacınız olmayacak.

Şifresini çözmek için, sadece şifreyi açma çağrısından önce bağlantı dizenize koymak meselesidir.

        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"- şifreleme ile uğraşmayı planlıyorsanız bu çok kötü bir ifadedir. Temel kural, anlamadıysanız asla kendiniz yapmamanızdır. Aksi takdirde hiç kullanmamanız daha iyi olur.
ahmd0

Senin değinmek istediğin noktayı anlıyorum. Çoğunlukla System.Data.Sqlite'ın geçerli sürümüyle çalışmadığını gördüğüm tavsiyeleri düzeltmeye çalışıyordum. Bunun iyi bir güvenlik olduğunu ima etmek istememiştim. Yazımı güncelledim. Giriş için teşekkürler!
Mike Warner

2

İstemci tarafındaki verileri her zaman şifreleyebilirsiniz. Performans sorunu olduğu için tüm verilerin şifrelenmesi gerekmediğini lütfen unutmayın.


1

Eh, SEEpahalıdır. Ancak SQLiteşifreleme için dahili bir arayüze sahiptir (Çağrı Cihazı). Bu, mevcut kodun üstünde birisinin kolayca bazı şifreleme mekanizmaları geliştirebileceği anlamına gelmez AES. Hiçbir şey gerçekten. Lütfen yazıma buradan bakın: https://stackoverflow.com/a/49161716/9418360

Çağrı cihazı şifrelemesini etkinleştirmek için SQLITE_HAS_CODEC = 1 tanımlamanız gerekir. Aşağıdaki örnek kod (orijinal SQLitekaynak):

#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

AES256 kullanarak şifreleme C languageiçin ticari bir sürüm var SQLite- aynı zamanda çalışabilir PHP, ancak derlenmesi PHPve SQLitegenişletilmesi gerekir. SQLiteVeritabanı dosyasını anında / şifreler , dosya içeriği her zaman şifrelenir. Çok kullanışlı.

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


0

SQLite'ın işlev oluşturma rutinlerini kullanabilirsiniz ( PHP kılavuzu ):

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

Veri eklerken, şifreleme işlevini doğrudan kullanabilir ve şifrelenmiş verileri INSERTleyebilir veya özel işlevi kullanabilir ve şifrelenmemiş verileri iletebilirsiniz:

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

Veri alırken SQL arama işlevini de kullanabilirsiniz:

$select_obj = $db_obj->prepare('SELECT Clear, ' .
 'Decrypt(Encrypted, "' . $passwordhash_str . '") AS PlainText FROM table ' .
 'WHERE PlainText LIKE :searchterm');
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.