SQLite con crittografia / protezione password


136

Sto solo imparando a usare SQLite ed ero curioso di sapere se è possibile:

  1. Crittografia del file di database?

  2. Protezione password apertura del database?

PS. So che esiste questa "estensione di crittografia SQLite (SEE)", ma secondo la documentazione "SEE è un software con licenza ...." e "Il costo di una licenza di codice sorgente perpetua per SEE è di $ 2000".


È certamente possibile e esistono diverse soluzioni open source oltre a SEE. Tra questi l'estensione di crittografia fornita con wxSQLite3. Vedi la mia risposta a una domanda simile per i dettagli.
Ulrich Telle,

1
@RobotMess: Ad essere sincero con te - nessuno di quelli elencati qui. Avevo rigorosi vincoli temporali per quel progetto, quindi dovevo fare qualcosa in fretta. Sono andato con quello che sapevo di più: AES sui dati grezzi prima di inserirlo nel DB ... Non è molto efficiente anche se in termini di ricerca, ricerca e gestione del DB.
ahmd0

@ ahmd0 Hm, questo non rende inutile il DB? Voglio dire, tutto ciò che fa ora è assicurarsi che gli commit siano atomici.
Navin,

Si è possibile. Se ho come target .Net Standard 4.6.1+ o Core, penso che un modo abbastanza semplice per ottenere la crittografia Sqlite sia usare Microsoft.Data.Sqlite per la mia risposta qui .
luglio

Risposte:


110

SQLite ha hook incorporati per la crittografia che non sono utilizzati nella distribuzione normale, ma qui ci sono alcune implementazioni che conosco:

  • VEDI - L'implementazione ufficiale.
  • wxSQLite - Un wrapper C ++ in stile wxWidgets che implementa anche la crittografia di SQLite.
  • SQLCipher - Utilizza la crittografia di openSSL per implementare.
  • SQLiteCrypt - Implementazione personalizzata, API modificata.
  • botansqlite3 - botansqlite3 è un codec di crittografia per SQLite3 che può utilizzare qualsiasi algoritmo in Botan per la crittografia.
  • sqleet - un'altra implementazione di crittografia, usando le primitive ChaCha20 / Poly1305. Nota che wxSQLite sopra menzionato può usarlo come provider di crittografia.

SEE e SQLiteCrypt richiedono l'acquisto di una licenza.

Divulgazione: ho creato botansqlite3.


1
Hai qualche documentazione sulla crittografia del database How-to-Use Botan per SQLite? Il sito Web Botan non menziona questa funzione.
Marc Schlösser,

5
botansqlite3 è ora distribuito indipendentemente da Botan.
OliJG,

1
C'è anche litereplica . Utilizza il codice ChaCha, più veloce di AES su dispositivi portatili basati su ARMv7
Bernardo Ramos,

SQLite3 .Net come supporto integrato per la crittografia ora, che invalida ampiamente questa risposta.
Krythic,

21

È possibile proteggere con password DB SQLite3. Per la prima volta prima di eseguire qualsiasi operazione, impostare la password come segue.

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

quindi la prossima volta puoi accedervi come

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

Ciò non consentirà a nessun editor GUI di visualizzare i tuoi dati. Successivamente, se si desidera modificare la password, utilizzare conn.ChangePassword("new_password"); Per reimpostare o rimuovere la password, utilizzareconn.ChangePassword(String.Empty);


16
Non funzionerà con Sqlite open source. Non si sa quale implementazione linguistica, lingua o API debba essere.
mikerobi,

1
Come faccio a sapere quale modo di crittografia ChangePasswordutilizzato? AES 128? RSA ..?
Qakmak,

1
RSA 1024 o 2048? C'è qualche documento che potrebbe vedere più dettagli?
Qakmak,


Nei miei test ho scoperto che il SetPasswordmetodo (in questo momento) sembra sostanzialmente inutile. L'unico modo in cui sono stato in grado di ottenere la System.Data.SQLitelibreria per applicare correttamente la password era utilizzare il ChangePasswordmetodo. Usando SetPassword( prima di chiamare il Openmetodo, come apparentemente richiesto dalla libreria), ero ancora in grado di aprire e modificare il DB in SQLiteStudio senza alcuna password. Non è stato fino a quando ho usato il ChangePasswordmetodo ( dopo aver chiamato il Openmetodo) che l'applicazione della password in realtà "bloccato".
G_Hosa_Phat il


7

È possibile ottenere sqlite3.dllfile con supporto per la crittografia da http://system.data.sqlite.org/ .

1 - Vai su http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki e scarica uno dei pacchetti. La versione .NET è irrilevante qui.

2 - Estrai SQLite.Interop.dlldal pacchetto e rinominalo in sqlite3.dll. Questa DLL supporta la crittografia tramite password in chiaro o chiavi di crittografia.

Il file menzionato è nativo e NON richiede .NET framework. Potrebbe essere necessario Visual C ++ Runtime a seconda del pacchetto scaricato.

AGGIORNARE

Questo è il pacchetto che ho scaricato per lo sviluppo a 32 bit: http://system.data.sqlite.org/blobs/1.0.94.0/sqlite-netFx40-static-binary-Win32-2010-1.0.94.0.zip


Nel mio esempio particolare avevo bisogno di un oggetto .libda incorporare nel mio eseguibile. Non potrei avere nessuna DLL.
ahmd0

2
Controlla anche questo github.com/rindeal/wxSQLite3-VS che ti darà un file libe dll.
Mohammad Banisaeid,

4

Tenere presente che quanto segue non intende sostituire una soluzione di sicurezza adeguata.

Dopo aver giocato con questo per quattro giorni, ho messo insieme una soluzione usando solo il pacchetto open source System.Data.SQLite di NuGet. Non so quanta protezione fornisca. Lo sto usando solo per il mio corso di studi. Ciò creerà il DB, lo crittograferà, creerà una tabella e aggiungerà i dati.

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

Facoltativamente, è possibile rimuoverlo conn.SetPassword(passwordBytes);e sostituirlo con il conn.ChangePassword("password");quale deve essere posizionato dopo conn.Open();anziché prima. Quindi non avrai bisogno del metodo GetBytes.

Per decrittografare, è solo una questione di mettere la password nella stringa di connessione prima di aprire la chiamata.

        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"- questa è una pessima affermazione se hai intenzione di gestire la crittografia. La regola empirica è che non lo fai mai da solo se non lo capisci. Altrimenti faresti meglio a non usarlo affatto.
ahmd0

Vedo il tuo punto. Stavo principalmente cercando di correggere i consigli che ho visto che non funzionano con l'attuale versione di System.Data.Sqlite. Non intendevo implicare che si trattasse di una buona sicurezza. Ho aggiornato il mio post. Grazie per l'input!
Mike Warner,

2

Puoi sempre crittografare i dati sul lato client. Si noti che non tutti i dati devono essere crittografati perché hanno un problema di prestazioni.


1

Bene, SEEè costoso. Tuttavia SQLiteha un'interfaccia integrata per la crittografia (Pager). Ciò significa che oltre al codice esistente si può facilmente sviluppare un meccanismo di crittografia, non è necessario AES. Qualcosa di veramente. Si prega di consultare il mio post qui: https://stackoverflow.com/a/49161716/9418360

È necessario definire SQLITE_HAS_CODEC = 1 per abilitare la crittografia cercapersone. Codice di esempio di seguito ( SQLitefonte originale ):

#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

Esiste una versione commerciale C languagedi SQLitecrittografia che utilizza AES256 - può anche funzionare con PHP, ma ha bisogno di essere compilato con PHPe SQLitel'estensione. De / crittografa il SQLitefile di database al volo, il contenuto del file è sempre crittografato. Molto utile.

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


0

È possibile utilizzare le routine di creazione delle funzioni di SQLite ( manuale di PHP ):

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

Quando si inseriscono i dati, è possibile utilizzare direttamente la funzione di crittografia e INSERIRE i dati crittografati oppure è possibile utilizzare la funzione personalizzata e trasmettere dati non crittografati:

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

Quando si recuperano i dati, è anche possibile utilizzare la funzionalità di ricerca SQL:

$select_obj = $db_obj->prepare('SELECT Clear, ' .
 'Decrypt(Encrypted, "' . $passwordhash_str . '") AS PlainText FROM table ' .
 'WHERE PlainText LIKE :searchterm');
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.