Proteggi con password un DB SQLite. È possibile?


88

Devo affrontare un nuovo piccolo progetto. Avrà circa 7 o 9 tabelle, la più grande delle quali crescerà fino a un tasso massimo di 1000 righe al mese.

Ho pensato a SQLite come al mio db ... Ma avrò bisogno di proteggere il db nel caso qualcuno volesse modificare i dati dal db

La mia domanda principale è:

È possibile proteggere con password un db sqlite come faresti all'accesso?

Quale altro RDBMS consiglieresti per una soluzione così piccola?

Lo sviluppo sarebbe su C #, ma sto cercando qualcosa di gratuito.


2
Potresti voler controllare SQLiteCrypt
Mike Buckbee il


Se devi bloccare / sbloccare il DB frequentemente per il debug, prova questo strumento goo.gl/12VnQd
Mangesh

Puoi trovare la soluzione qui inserisci la descrizione del link qui
Ishwar Rimal

Risposte:


73

È possibile proteggere con password un DB SQLite3. 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 che puoi accedervi come

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

Ciò non consentirà a nessun editor della GUI di visualizzare i tuoi dati. Alcuni editor possono decrittografare il database se fornisci la password. L'algoritmo utilizzato è RSA.

Successivamente, se desideri modificare la password, utilizza

conn.ChangePassword("new_password");

Per reimpostare o rimuovere la password, utilizzare

conn.ChangePassword(String.Empty);

L'unico strumento gratuito che ho trovato finora che aprirà database protetti da password come questo è SQLite2009 Pro dettagliato in questa risposta .
JumpingJezza

In che lingua è questo esempio? Sembra .NET?
pim

1
Tecnicamente, .NET è un framework. C # è la lingua visualizzata qui.
vapcguy

Inoltre, bisogna stare attenti con l'aggiornamento la stringa di connessione prima della prossima apertura ogni volta che si cambia la password o si può finire di fronte a errori: stackoverflow.com/questions/16030601/...
vapcguy

Nota che, senza la password fornita, Open () NON fallirà su un database SQLite protetto da password, come ti aspetteresti! Ciò che non riesce è qualsiasi operazione successiva sui dati o sui metadati su quel file aperto.
Cristi S.

33

È possibile utilizzare la crittografia incorporata del provider sqlite .net (System.Data.SQLite). Ulteriori dettagli su http://web.archive.org/web/20070813071554/http://sqlite.phxsoftware.com/forums/t/130.aspx

Per crittografare un database non crittografato esistente o per modificare la password di un database crittografato , aprire il database e quindi utilizzare la funzione ChangePassword () di SQLiteConnection:

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

Per decrittografare una chiamata al database crittografata esistenteChangePassword() con una password NULLo "":

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

Per aprire un database crittografato esistente o per creare un nuovo database crittografato, specificare una password ConnectionStringcome mostrato nell'esempio precedente o chiamare la SetPassword()funzione prima di aprirne uno nuovo SQLiteConnection. Le password specificate in ConnectionStringdevono essere in chiaro, ma le password fornite nella SetPassword()funzione possono essere array di byte binari.

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

Per impostazione predefinita, la parola chiave ATTACH utilizzerà la stessa chiave di crittografia del database principale quando si collega un altro file di database a una connessione esistente. Per modificare questo comportamento, utilizza il modificatore KEY come segue:

Se stai allegando un database crittografato utilizzando una password in chiaro:

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

Per allegare un database crittografato utilizzando una password binaria:

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

2
Questa risposta solo link è in effetti un chiaro esempio del motivo per cui non facciamo risposte solo link in SO. Il collegamento effettivo è andato; non esiste più. L'unico motivo per cui siamo in grado di vedere il sito è perché è stato archiviato automaticamente da web.archive.org.
Hanlet Escaño

Non funziona più, nessuna di queste funzioni si trova nelle ultime versioni.
MindRoasterMir

12

Usa SQLCipher, è un'estensione opensource per SQLite che fornisce la crittografia AES a 256 bit trasparente dei file di database. http://sqlcipher.net


1
E la velocità? Se uso sqlcipher ridurrà le prestazioni?
TomSawyer

6

Puoi crittografare il tuo database SQLite con il componente aggiuntivo SEE. In questo modo previeni accessi / modifiche non autorizzati.

Citando la documentazione di SQLite:

SQLite Encryption Extension (SEE) è una versione avanzata di SQLite che crittografa i file di database utilizzando AES a 128 bit o 256 bit per impedire l'accesso o la modifica non autorizzati. L'intero file di database è crittografato in modo che a un osservatore esterno il file di database sembra contenere rumore bianco. Non c'è niente che identifichi il file come un database SQLite.

Puoi trovare maggiori informazioni su questo componente aggiuntivo in questo link .


7
quell'estensione è anche un addon a pagamento per sqlite.
John Boker

3

Un'opzione sarebbe VistaDB . Consentono di proteggere i database (o anche le tabelle) con password (e facoltativamente crittografarli).


1
Esistono modi più efficienti e gratuiti!
Sawan

1
@MSS Ma, come ho detto, la soluzione VistaDB presenta alcuni vantaggi, inclusa la crittografia separata a livello di tabella invece della crittografia completa della connessione DB. Non conosco nessun'altra opzione nativa .NET che riesca a farlo. È anche gestito in modo puro, a differenza della maggior parte delle altre opzioni - solo perché non è gratuito non significa che ci siano opzioni più efficienti o migliori - dipende completamente dai requisiti di utilizzo.
Reed Copsey

3

per la tua domanda sulla protezione della password del tuo db sqlite, non penso che possa essere fatto.

puoi crittografarlo, ecco alcune informazioni su questo:

http://sqlcrypt.com/

è $ 149 per piattaforma.


3

Se usi FluentNHibernate puoi usare il seguente codice di configurazione:

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

Il metodo UsingFileWithPassword (nomefile, password) crittografa un file di database e imposta la password.
Viene eseguito solo se viene creato il nuovo file di database. Il vecchio non crittografato fallisce quando viene aperto con questo metodo.


2

So che questa è una vecchia domanda, ma la soluzione semplice non sarebbe semplicemente proteggere il file a livello di sistema operativo? Basta impedire agli utenti di accedere al file e quindi non dovrebbero essere in grado di toccarlo. Questa è solo una supposizione e non sono sicuro che sia una soluzione ideale.


2
Non sono sicuro che sia una buona soluzione perché chiunque abbia una chiavetta USB potrebbe avviare un altro sistema operativo e leggere i file.
nurettin

Penso che sia giusto sottolineare, ma in tal caso disabilitare l'USB. Se alcuni hanno accesso fisico alla tua macchina, ci sono molte altre cose che possono essere fatte.
David Price

Vuoi proteggere i dati sensibili in modo che solo quelle altre cose vadano storte.
tripleee

Con il database SQLite, questo in realtà NON è affatto possibile. È necessario che gli utenti siano in grado sia di leggere che di scrivere su di esso, il che significa che l'ACL della cartella in cui risiede il database SQLite deve consentire anche loro quelle autorizzazioni. Puoi proteggerlo dai non utenti consentendo solo agli utenti reali il permesso di accedere a quella cartella, ma hai ancora la "minaccia interna".
vapcguy

1

Perché hai bisogno di crittografare il database? L'utente potrebbe facilmente smontare il programma e capire la chiave. Se lo stai crittografando per il trasferimento di rete, considera l'utilizzo di PGP invece di comprimere un livello di crittografia in un livello di database.


6
All'utente potrebbe essere richiesta la password all'avvio in modo che nessuna chiave sia ottenibile smontando il programma.
kgadek

1
Usa Redgate Reflector o ILSpy.
Zev Spitz

4
Perché dovresti mettere la chiave nel programma? non lo faresti, genererai una chiave dalla password degli utenti e la userai, quindi non avrai bisogno di segreti nel tuo codice sorgente.
Trampster
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.