Kennwort Schützen Sie eine SQLite-Datenbank. Ist es möglich?

87

Ich muss mich einem neuen kleinen Projekt stellen. Es wird ungefähr 7 oder 9 Tabellen haben, von denen die größte um maximal 1000 Zeilen pro Monat wächst.

Ich dachte an SQLite als meine Datenbank ... Aber ich muss die Datenbank schützen, falls jemand Daten aus der Datenbank ändern möchte

Meine Hauptfrage ist:

Ist es möglich, eine SQLite-Datenbank mit einem Passwort zu schützen, wie Sie es beim Zugriff tun würden?

Welches andere RDBMS würden Sie für eine so kleine Lösung empfehlen?

Die Entwicklung wäre auf C #, aber ich suche etwas freies.

Jhonny D. Cano -Leftware-
quelle
2
Vielleicht möchten Sie SQLiteCrypt
Mike Buckbee
Wenn Sie DB häufig zum Debuggen sperren / entsperren müssen, versuchen Sie dieses Tool goo.gl/12VnQd
Mangesh
Die Lösung finden Sie hier.
Geben Sie
Mögliches Duplikat von SQLite mit Verschlüsselung / Passwortschutz
iammilind

Antworten:

72

Sie können eine SQLite3-Datenbank mit einem Kennwort schützen. Stellen Sie das Kennwort wie folgt ein, bevor Sie Vorgänge ausführen.

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. Einige Editoren können die Datenbank entschlüsseln, wenn Sie das Kennwort angeben. Der verwendete Algorithmus ist RSA.

Wenn Sie später das Passwort ändern möchten, verwenden Sie

conn.ChangePassword("new_password");

Verwenden Sie zum Zurücksetzen oder Entfernen des Kennworts

conn.ChangePassword(String.Empty);
Mangesh
quelle
Das einzige kostenlose Tool, das ich bisher gefunden habe, um passwortgeschützte Datenbanken wie diese zu öffnen, ist SQLite2009 Pro, das in dieser Antwort beschrieben wird .
JumpingJezza
Welche Sprache ist dieses Beispiel? Sieht aus wie .NET?
Pimbrouwers
1
Technisch gesehen ist .NET ein Framework. C # ist die Sprache, die hier angezeigt wird.
Vapcguy
Außerdem müssen Sie bei jeder Änderung des Kennworts vor dem nächsten Öffnen vorsichtig sein, um die Verbindungszeichenfolge zu aktualisieren, da sonst Fehler auftreten können: stackoverflow.com/questions/16030601/…
vapcguy
Beachten Sie, dass Open () ohne Kennwort in einer kennwortgeschützten SQLite-Datenbank NICHT wie erwartet fehlschlägt! Was fehlschlägt, ist eine nachfolgende Daten- oder Metadatenoperation für diese geöffnete Datei.
Cristi S.
33

Sie können die integrierte Verschlüsselung des SQLite .net-Anbieters (System.Data.SQLite) verwenden. Weitere Informationen finden Sie unter http://web.archive.org/web/20070813071554/http://sqlite.phxsoftware.com/forums/t/130.aspx

Öffnen Sie die Datenbank und verwenden Sie die ChangePassword () - Funktion von SQLiteConnection, um eine vorhandene unverschlüsselte Datenbank zu verschlüsseln oder das Kennwort einer verschlüsselten Datenbank zu ändern:

// 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");

Um eine vorhandene verschlüsselte Datenbank zu entschlüsseln Aufruf ChangePassword()mit einem NULLoder ""Passwort:

// 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);

Geben Sie zum Öffnen einer vorhandenen verschlüsselten Datenbank oder zum Erstellen einer neuen verschlüsselten Datenbank ein Kennwort an, ConnectionStringwie im vorherigen Beispiel gezeigt, oder rufen Sie die SetPassword()Funktion auf, bevor Sie eine neue öffnen SQLiteConnection. Die in der angegebenen Kennwörter ConnectionStringmüssen Klartext sein, die in der SetPassword()Funktion angegebenen Kennwörter können jedoch Binärbyte-Arrays sein.

// 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

Standardmäßig verwendet das Schlüsselwort ATTACH denselben Verschlüsselungsschlüssel wie die Hauptdatenbank, wenn eine andere Datenbankdatei an eine vorhandene Verbindung angehängt wird. Um dieses Verhalten zu ändern, verwenden Sie den KEY-Modifikator wie folgt:

Wenn Sie eine verschlüsselte Datenbank mit einem Klartextkennwort anhängen:

// 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();

So hängen Sie eine verschlüsselte Datenbank mit einem binären Kennwort an:

// 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();
Liron Levi
quelle
2
Diese Nur-Link-Antwort ist in der Tat ein klares Beispiel dafür, warum wir bei SO keine Nur-Link-Antworten geben. Der eigentliche Link ist weg; es existiert nicht mehr. Der einzige Grund, warum wir die Site sehen können, ist, dass sie automatisch von web.archive.org archiviert wurde.
Hanlet Escaño
Es funktioniert nicht mehr, solche Funktionen gibt es in den neuesten Versionen nicht mehr.
MindRoasterMir
12

Verwenden Sie SQLCipher, eine OpenSource-Erweiterung für SQLite, die eine transparente 256-Bit-AES-Verschlüsselung von Datenbankdateien bietet. http://sqlcipher.net

Avdaff
quelle
1
Wie wäre es mit Geschwindigkeit? Wenn ich sqlcipher verwende, wird es die Leistung verringern?
TomSawyer
6

Sie können Ihre SQLite-Datenbank mit dem SEE-Addon verschlüsseln. Auf diese Weise verhindern Sie unbefugten Zugriff / unbefugte Änderung.

Zitieren der SQLite-Dokumentation:

Die SQLite Encryption Extension (SEE) ist eine erweiterte Version von SQLite, die Datenbankdateien mit 128-Bit- oder 256-Bit-AES verschlüsselt, um unbefugten Zugriff oder Änderungen zu verhindern. Die gesamte Datenbankdatei ist verschlüsselt, sodass die Datenbankdatei für einen externen Beobachter weißes Rauschen zu enthalten scheint. Es gibt nichts, was die Datei als SQLite-Datenbank identifiziert.

Weitere Informationen zu diesem Addon finden Sie unter diesem Link .

rogeriopvl
quelle
7
Diese Erweiterung ist auch ein kostenpflichtiges Addon für SQLite.
John Boker
3

Eine Option wäre VistaDB . Sie ermöglichen es, Datenbanken (oder sogar Tabellen) passwortgeschützt (und optional verschlüsselt) zu machen.

Reed Copsey
quelle
1
Es gibt effizientere und kostenlosere Wege!
Sawan
1
@MSS Aber - wie gesagt - die VistaDB-Lösung bietet einige Vorteile, einschließlich einer separaten Verschlüsselung auf Tabellenebene anstelle einer vollständigen DB-Verbindungsverschlüsselung. Ich kenne keine andere native .NET-Option, die dies ermöglicht. Im Gegensatz zu den meisten anderen Optionen wird es auch rein verwaltet - nur weil es nicht kostenlos ist, bedeutet dies nicht, dass es effizientere oder bessere Optionen gibt - es hängt vollständig von den Nutzungsanforderungen ab.
Reed Copsey
3

Für Ihre Frage zum Passwortschutz Ihrer SQLite-Datenbank glaube ich nicht, dass dies möglich ist.

Sie können es jedoch verschlüsseln. Hier einige Informationen dazu:

http://sqlcrypt.com/

Es sind 149 US-Dollar pro Plattform.

John Boker
quelle
3

Wenn Sie FluentNHibernate verwenden , können Sie folgenden Konfigurationscode verwenden:

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

Methode UsingFileWithPassword (Dateiname, Passwort) verschlüsselt eine Datenbankdatei und legt das Passwort fest.
Es wird nur ausgeführt, wenn die neue Datenbankdatei erstellt wird. Die alte, nicht verschlüsselte Version schlägt fehl, wenn sie mit dieser Methode geöffnet wird.

Bronek
quelle
2

Ich weiß, dass dies eine alte Frage ist, aber wäre die einfache Lösung nicht, die Datei nur auf Betriebssystemebene zu schützen? Verhindern Sie einfach, dass die Benutzer auf die Datei zugreifen, und dann sollten sie sie nicht berühren können. Dies ist nur eine Vermutung und ich bin mir nicht sicher, ob dies eine ideale Lösung ist.

David Price
quelle
2
Ich bin mir nicht sicher, ob dies eine gute Lösung ist, da jeder mit einem USB-Stick ein anderes Betriebssystem starten und die Dateien lesen kann.
Nurettin
Ich denke, das ist fair, aber in diesem Fall deaktivieren Sie den USB. Wenn einige physischen Zugriff auf Ihre Maschine haben, können viele andere Dinge getan werden.
David Price
Sie möchten vertrauliche Daten schützen, damit nur diese anderen Dinge schief gehen.
Tripleee
Mit der SQLite-Datenbank ist dies eigentlich überhaupt nicht möglich. Benutzer müssen in der Lage sein, sowohl zu lesen als auch zu schreiben. Dies bedeutet, dass die ACL des Ordners, in dem sich die SQLite-Datenbank befindet, ihnen auch diese Berechtigungen gewähren muss. Sie können es gegen Nichtbenutzer sichern, indem Sie nur den echten Benutzern die Berechtigung für diesen Ordner gewähren, aber Sie haben immer noch die "Insider-Bedrohung".
Vapcguy
1

Warum müssen Sie die Datenbank verschlüsseln? Der Benutzer kann Ihr Programm leicht zerlegen und den Schlüssel herausfinden. Wenn Sie es für die Netzwerkübertragung verschlüsseln, sollten Sie PGP verwenden, anstatt eine Verschlüsselungsschicht in eine Datenbankschicht zu komprimieren.

Trever Fischer
quelle
5
Der Benutzer könnte beim Start nach einem Passwort gefragt werden, sodass durch Zerlegen des Programms kein Schlüssel erreichbar wäre.
kgadek
1
Verwenden Sie Redgate Reflector oder ILSpy.
Zev Spitz
4
Warum würden Sie den Schlüssel in das Programm stecken? Sie würden das nicht tun, einen Schlüssel aus dem Benutzerpasswort generieren und diesen verwenden, dann brauchen Sie keine Geheimnisse in Ihrem Quellcode.
Trampster