Ich lerne gerade, SQLite zu verwenden, und ich war gespannt, ob dies möglich ist:
Verschlüsselung der Datenbankdatei?
Passwortschutz beim Öffnen der Datenbank?
PS. Ich weiß, dass es diese "SQLite Encryption Extension (SEE)" gibt, aber laut der Dokumentation "The SEE ist lizenzierte Software ..." und "Die Kosten einer unbefristeten Quellcodelizenz für SEE betragen 2000 US-Dollar."
SQLite hat eingebaute Hooks für die Verschlüsselung, die in der Normalverteilung nicht verwendet werden. Hier einige Implementierungen, die ich kenne:
SEE, SQLiteCrypt und SQLiteCrypt erfordern den Erwerb einer Lizenz.
Offenlegung: Ich habe Botansqlite3 erstellt.
Sie können die SQLite3-Datenbank mit einem Kennwort schützen . Legen Sie das Kennwort zum ersten Mal vor allen Vorgängen wie folgt fest.
SQLiteConnection conn = new SQLiteConnection("Data Source=MyDatabase.sqlite;Version=3;");
conn.SetPassword("password");
conn.open();
dann kannst du nächstes mal gerne darauf zugreifen
conn = new SQLiteConnection("Data Source=MyDatabase.sqlite;Version=3;Password=password;");
conn.Open();
Dies erlaubt keinem GUI-Editor, Ihre Daten anzuzeigen. Wenn Sie das Kennwort ändern möchten, verwenden Sie conn.ChangePassword("new_password");
Wenn Sie das Kennwort zurücksetzen oder entfernen möchten, verwenden Sie conn.ChangePassword(String.Empty);
.
Die .net-Bibliothek System.Data.SQLite sorgt auch für die Verschlüsselung.
Sie können die Datei sqlite3.dll
mit Verschlüsselungsunterstützung von http://system.data.sqlite.org/ erhalten.
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 ist hier nicht relevant.
2 - SQLite.Interop.dll
aus dem Paket extrahieren und in sqlite3.dll
umbenennen. Diese DLL unterstützt die Verschlüsselung über Klartextkennwörter oder Verschlüsselungsschlüssel.
Die erwähnte Datei ist native und erfordert NICHT .NET Framework. Je nach heruntergeladenem Paket ist möglicherweise eine Visual C++ - Laufzeit erforderlich.
UPDATE
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 .Postleitzahl
Dies ist durchaus möglich und neben SEE gibt es mehrere Open Source-Lösungen. Darunter die Verschlüsselungserweiterung von wxSQLite3. Siehe meine Antwort auf eine ähnliche Frage für Details.
Beachten Sie, dass das Folgende nicht als Ersatz für eine geeignete Sicherheitslösung gedacht ist.
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 das bietet. Ich benutze es nur für mein eigenes Studium. 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 conn.SetPassword(passwordBytes);
entfernen und durch conn.ChangePassword("password");
ersetzen, die nach conn.Open();
statt zuvor platziert werden muss. Dann benötigen Sie die GetBytes-Methode nicht.
Zum Entschlüsseln müssen Sie lediglich das Kennwort in die Verbindungszeichenfolge eingeben, bevor Sie den Anruf öffnen.
string filename = @"C:\Programming\sqlite3\db.db";
string passwordString = "password";
SQLiteConnection conn = new SQLiteConnection("Data Source=" + filename + ";Version=3;Password=" + passwordString + ";");
conn.Open();
Sie können Daten immer auf der Clientseite verschlüsseln. Bitte beachten Sie, dass nicht alle Daten verschlüsselt werden müssen, da dies zu einem Leistungsproblem führt.
Nun, SEE
ist teuer. SQLite
hat jedoch eine integrierte Schnittstelle für die Verschlüsselung (Pager). Das bedeutet, dass man über vorhandenen Code leicht einen Verschlüsselungsmechanismus entwickeln kann, muss nicht AES
sein. Alles wirklich ... Bitte sehen 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 (ursprüngliche SQLite
-Quelle):
#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 in C language
für die SQLite
-Verschlüsselung mit AES256 - sie kann auch mit PHP
arbeiten, muss jedoch mit der Erweiterung PHP
und SQLite
kompiliert werden. Die Datenbankdatei SQLite
wird im laufenden Betrieb entschlüsselt, der Inhalt der Dateien wird immer verschlüsselt. Sehr hilfreich.
Ja es ist möglich. Beim Targeting von .Net Standard 4.6.1 oder Core denke ich, dass es ziemlich einfach ist, Sqlite-Verschlüsselung zu erhalten, Microsoft.Data.Sqlite für meine Antwort hier zu verwenden.
Sie können die Funktionserstellungsroutinen von SQLite verwenden ( PHP manual ):
$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');
Bei Projekten, die Javascript verwenden, funktioniert das von journeyapps geschriebene Paket nahtlos.
https://github.com/journeyapps/node-sqlcipher
Bei mir funktionierte es unter Mac/Windows/Linux. Es kompiliert SQLCipher auf Ihrer Plattform. Die Lizenzen von Zetetic müssen nicht bezahlt werden.
Es enthält alles, was Sie suchen.
db browser für sqlite:
Einfache Tabellenerstellung, einfache Datenänderung, einfaches Löschen und einfach anzuzeigende Komponenten.
dokument: