SQLite mit Verschlüsselungs- / Passwortschutz

136

Ich lerne gerade SQLite und war neugierig, ob dies möglich ist:

  1. Verschlüsselung der Datenbankdatei?

  2. Passwort schützen Öffnen der Datenbank?

PS. Ich weiß, dass es diese "SQLite Encryption Extension (SEE)" gibt, aber laut Dokumentation "The SEE ist lizenzierte Software ..." und "Die Kosten für eine unbefristete Quellcodelizenz für SEE betragen 2000 US-Dollar."

ahmd0
quelle
Es ist sicherlich möglich und es gibt neben SEE mehrere Open Source-Lösungen. Darunter die mit wxSQLite3 gelieferte Verschlüsselungserweiterung. Siehe meine Antwort auf eine ähnliche Frage für Details.
Ulrich Telle
1
@RobotMess: Um ehrlich zu sein - keiner der hier aufgeführten. Ich hatte strenge Zeitbeschränkungen für dieses Projekt, also musste ich schnell etwas unternehmen. Ich habe mich für das entschieden, was ich am besten wusste - AES für die Rohdaten, bevor sie in die Datenbank gestellt wurden ... Es ist jedoch nicht sehr effizient in Bezug auf Suche, Suche und DB-Verwaltung.
ahmd0
@ ahmd0 Hm, macht das die DB nicht irgendwie nutzlos? Ich meine, alles, was es jetzt wirklich tut, ist sicherzustellen, dass Commits atomar sind.
Navin
Ja es ist möglich. Wenn Sie auf .Net Standard 4.6.1+ oder Core abzielen, ist es meiner Meinung nach ziemlich einfach, Microsoft.Data.Sqlite gemäß meiner Antwort hier zu verwenden, um eine SQLite-Verschlüsselung zu erhalten .
paulyb

Antworten:

110

In SQLite sind Hooks für die Verschlüsselung integriert, die in der Normalverteilung nicht verwendet werden. Hier sind jedoch einige mir bekannte Implementierungen:

  • SIEHE - Die offizielle Umsetzung.
  • wxSQLite - Ein C ++ - Wrapper im wxWidgets-Stil, der auch die SQLite-Verschlüsselung implementiert.
  • SQLCipher - Verwendet zur Implementierung libSSrypto von openSSL.
  • SQLiteCrypt - Benutzerdefinierte Implementierung, geänderte API.
  • botansqlite3 - botansqlite3 ist ein Verschlüsselungscodec für SQLite3, der alle Algorithmen in Botan zur Verschlüsselung verwenden kann.
  • sqleet - eine weitere Verschlüsselungsimplementierung mit ChaCha20 / Poly1305-Grundelementen. Beachten Sie, dass wxSQLite, das oben erwähnt wurde, dies als Kryptoanbieter verwenden kann.

Für SEE und SQLiteCrypt muss eine Lizenz erworben werden.

Offenlegung: Ich habe botansqlite3 erstellt.

OliJG
quelle
1
Haben Sie eine Dokumentation zur Verwendung von Botan für die SQLite-Datenbankverschlüsselung? Auf der Botan-Website wird diese Funktion nicht erwähnt.
Marc Schlösser
5
botansqlite3 wird jetzt unabhängig von Botan vertrieben.
OliJG
1
Es gibt auch Litereplica . Es verwendet die ChaCha-Verschlüsselung, schneller als AES auf tragbaren Geräten basierend auf ARMv7
Bernardo Ramos
SQLite3 .Net unterstützt jetzt die Verschlüsselung, wodurch diese Antwort weitgehend ungültig wird.
Krythic
21

Sie können SQLite3 DB mit einem Kennwort schützen. Stellen Sie das Kennwort zum ersten Mal vor dem Ausführen von Vorgängen wie folgt ein.

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

dann kannst du das nächste mal gerne darauf zugreifen

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

Dadurch kann kein GUI-Editor Ihre Daten anzeigen. Wenn Sie das Passwort später ändern möchten, verwenden Sie conn.ChangePassword("new_password"); Zum Zurücksetzen oder Entfernen des Passworts die Optionconn.ChangePassword(String.Empty);

Mangesh
quelle
16
Funktioniert nicht mit Open Source Sqlite. Keine Ahnung, welche Sprachimplementierung, Sprache oder API dies sein soll.
Mikerobi
1
Woher weiß ich, welche Verschlüsselungsmethode ChangePasswordverwendet wird? AES 128? RSA ..?
Qakmak
1
RSA 1024 oder 2048? Gibt es ein Dokument, das mehr Details sehen könnte?
Qakmak
Holen Sie sich die Dokumente von hier system.data.sqlite.org/index.html/doc/trunk/www/index.wiki
Mangesh
In meinen eigenen Tests habe ich festgestellt, dass die SetPasswordMethode (zu diesem Zeitpunkt) im Grunde genommen nutzlos erscheint. Die einzige Möglichkeit, die System.Data.SQLiteBibliothek dazu zu bringen, das Kennwort ordnungsgemäß anzuwenden, war die Verwendung der ChangePasswordMethode. Mit SetPassword( vor dem Aufrufen der OpenMethode, wie es anscheinend von der Bibliothek verlangt wird) konnte ich die Datenbank in SQLiteStudio weiterhin ohne Kennwort öffnen und bearbeiten. Erst als ich die ChangePasswordMethode verwendete ( nach dem Aufrufen der OpenMethode), blieb die Passwortanwendung tatsächlich "hängen".
G_Hosa_Phat
15

Die .net-Bibliothek System.Data.SQLite bietet auch Verschlüsselung.

Rory
quelle
8
ASP.NET! = SQL Server! = Installierte Instanz von SQL Server
Zev Spitz
1
Aber System.Data.SQLite ist nicht von Microsoft. Bei dieser Frage geht es nicht um .Net, aber wenn dies der Fall wäre, wären andere Kompatibilitäten und Inkompatibilitäten wichtig.
user34660
7

Sie können erhalten sqlite3.dllDatei mit Verschlüsselungsunterstützung von http://system.data.sqlite.org/ .

1 - Gehen Sie zu http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki und laden Sie eines der Pakete herunter. Die .NET-Version spielt hier keine Rolle.

2 - SQLite.Interop.dllAus dem Paket extrahieren und in umbenennen sqlite3.dll. Diese DLL unterstützt die Verschlüsselung über Klartextkennwörter oder Verschlüsselungsschlüssel.

Die erwähnte Datei ist nativ und erfordert KEIN .NET Framework. Abhängig vom heruntergeladenen Paket ist möglicherweise Visual C ++ Runtime erforderlich.

AKTUALISIEREN

Dies ist das Paket, das ich für die 32-Bit-Entwicklung heruntergeladen habe: http://system.data.sqlite.org/blobs/1.0.94.0/sqlite-netFx40-static-binary-Win32-2010-1.0.94.0.zip

Mohammad Banisaeid
quelle
In meinem speziellen Beispiel brauchte ich eine .lib, die ich in meine ausführbare Datei einbetten konnte. Ich konnte keine DLLs haben.
ahmd0
2
Bitte überprüfen Sie auch diese eine github.com/rindeal/wxSQLite3-VS, die Ihnen eine libund dllDatei geben wird.
Mohammad Banisaeid
4

Beachten Sie, dass das Folgende kein Ersatz für eine ordnungsgemäße Sicherheitslösung sein soll.

Nachdem ich vier Tage damit herumgespielt habe, habe ich eine Lösung zusammengestellt, die nur das Open-Source-Paket System.Data.SQLite von NuGet verwendet. Ich weiß nicht, wie viel Schutz dies bietet. Ich benutze es nur für meinen eigenen Studiengang. Dadurch wird die Datenbank erstellt, verschlüsselt, eine Tabelle erstellt und Daten hinzugefügt.

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

Optional können Sie es entfernen conn.SetPassword(passwordBytes);und ersetzen, wobei es conn.ChangePassword("password");nachher conn.Open();statt nachher platziert werden muss . Dann brauchen Sie die GetBytes-Methode nicht.

Zum Entschlüsseln müssen Sie lediglich das Kennwort vor dem Öffnen des Anrufs in Ihre Verbindungszeichenfolge eingeben.

        string filename = @"C:\Programming\sqlite3\db.db";
        string passwordString = "password";
        SQLiteConnection conn = new SQLiteConnection("Data Source=" + filename + ";Version=3;Password=" + passwordString + ";");
        conn.Open();
Mike Warner
quelle
2
"I think I saw 128 bit somewhere"- Dies ist eine sehr schlechte Aussage, wenn Sie sich mit Verschlüsselung befassen möchten. Als Faustregel gilt, dass Sie es niemals selbst tun, wenn Sie es nicht verstehen. Andernfalls ist es besser, wenn Sie es überhaupt nicht verwenden.
ahmd0
Ich weiß, worauf du hinauswillst. Ich habe hauptsächlich versucht, den Rat zu korrigieren, den ich gesehen habe und der mit der aktuellen Version von System.Data.Sqlite nicht funktioniert. Ich wollte nicht implizieren, dass dies eine gute Sicherheit war. Ich habe meinen Beitrag aktualisiert. Danke für die Eingabe!
Mike Warner
2

Sie können Daten auf der Clientseite jederzeit verschlüsseln. Bitte beachten Sie, dass nicht alle Daten verschlüsselt werden müssen, da es zu Leistungsproblemen kommt.

Marcin
quelle
1

Na ja, SEEist teuer. Die SQLiteSchnittstelle ist jedoch für die Verschlüsselung (Pager) integriert. Dies bedeutet, dass man zusätzlich zu vorhandenem Code leicht einen Verschlüsselungsmechanismus entwickeln kann, der nicht sein muss AES. Alles wirklich. Bitte lesen Sie meinen Beitrag hier: https://stackoverflow.com/a/49161716/9418360

Sie müssen SQLITE_HAS_CODEC = 1 definieren, um die Pager-Verschlüsselung zu aktivieren. Beispielcode unten (Originalquelle 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

Es gibt eine kommerzielle Version C languagefür die SQLiteVerschlüsselung mit AES256 - sie kann auch verwendet werden PHP, muss jedoch kompiliert PHPund SQLiteerweitert werden. Es entschlüsselt / verschlüsselt die SQLiteDatenbankdatei im laufenden Betrieb, der Dateiinhalt wird immer verschlüsselt. Sehr hilfreich.

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

q74
quelle
0

Sie können die Routinen zur Funktionserstellung von SQLite verwenden ( PHP-Handbuch ):

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

Beim Einfügen von Daten können Sie die Verschlüsselungsfunktion direkt verwenden und die verschlüsselten Daten einfügen, oder Sie können die benutzerdefinierte Funktion verwenden und unverschlüsselte Daten übergeben:

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

Beim Abrufen von Daten können Sie auch die SQL-Suchfunktion verwenden:

$select_obj = $db_obj->prepare('SELECT Clear, ' .
 'Decrypt(Encrypted, "' . $passwordhash_str . '") AS PlainText FROM table ' .
 'WHERE PlainText LIKE :searchterm');
Alien426
quelle