it-swarm.com.de

SQLite mit Verschlüsselung/Passwortschutz

Ich lerne gerade, SQLite zu verwenden, und ich war gespannt, ob dies möglich ist:

  1. Verschlüsselung der Datenbankdatei?

  2. 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."

108
ahmd0

SQLite hat eingebaute Hooks für die Verschlüsselung, die in der Normalverteilung nicht verwendet werden. Hier einige Implementierungen, die ich kenne:

  • SIEHE - Die offizielle Umsetzung.
  • wxSQLite - Ein C++ - Wrapper im wxWidgets-Stil, der auch die Verschlüsselung von SQLite implementiert.
  • SQLCipher - Verwendet die libcrypto von openSSL zur Implementierung.
  • SQLiteCrypt - Benutzerdefinierte Implementierung, geänderte API.
  • botansqlite3 - botansqlite3 ist ein Verschlüsselungscodec für SQLite3, der zur Verschlüsselung beliebige Algorithmen in Botan verwenden kann.
  • SQLiteCrypto - SQLiteCrypto ist der einfachere Weg zum Verschlüsseln der SQLite-Datenbank von AES-256 und SHA-256 

SEE, SQLiteCrypt und SQLiteCrypt erfordern den Erwerb einer Lizenz.

Offenlegung: Ich habe Botansqlite3 erstellt.

90
OliJG

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

16
Mangesh

Die .net-Bibliothek System.Data.SQLite sorgt auch für die Verschlüsselung. 

14
Rory

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

7

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.

3
Ulrich Telle

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();
3
Mike Warner

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. 

2
Marcin

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.

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

1
q74

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.

0
paulyb

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');
0
Alien426

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.

0
liangzan

Es enthält alles, was Sie suchen.

db browser für sqlite:

https://sqlitebrowser.org/

Einfache Tabellenerstellung, einfache Datenänderung, einfaches Löschen und einfach anzuzeigende Komponenten.

dokument:

https://github.com/sqlitebrowser/sqlitebrowser/wiki

0
SHO