2009-06-12 14 views
5

Ho un db sqlite3 che inserisco/seleziono da in python. L'app funziona benissimo ma voglio modificarlo in modo che nessuno possa leggere dal DB senza una password. Come posso farlo in Python? nota non ho idea da dove iniziare.File crittografato o db in python

risposta

1

I database SQLite sono piuttosto leggibili dall'uomo e non sono presenti crittografi incorporati.

Siete preoccupati che qualcuno acceda e leggendo direttamente i file del database o accedano tramite il vostro programma?

Sto assumendo il primo, perché quest'ultimo non è realmente correlato al database: è la sicurezza della tua applicazione che stai chiedendo.

Alcune opzioni vengono in mente:

  1. Proteggere il db con le autorizzazioni del file system, piuttosto che la crittografia. Non hai menzionato quale sia il tuo ambiente, quindi non posso dire se questo sia praticabile per te o meno, ma è probabilmente il modo più semplice e affidabile, dato che non puoi provare a decodificare ciò che non puoi leggere.
  2. Encrypt in Python prima di scrivere e decrittografare in Python dopo la lettura. Abbastanza semplice, ma si perde la maggior parte della potenza delle operazioni di corrispondenza basate su set di SQL.
  3. Passare a un altro database; l'autenticazione utente e le autorizzazioni sono caratteristiche standard della maggior parte dei database multiutente. Quando ti trovi di fronte ai limiti di uno strumento, potrebbe essere più semplice dare un'occhiata ad altri strumenti piuttosto che hackerare nuove funzionalità nello strumento corrente.
+0

Ho la stessa domanda, eccetto che non posso usare altri database perché sqlite è leggero per un'applicazione desktop che sto cercando di scrivere (un software di registrazione privato) –

9

È possibile utilizzare SQLCipher.

http://sqlcipher.net/

Open Source di crittografia completo del database SQLite per

SQLCipher è un'estensione SQLite che fornisce trasparente a 256 bit AES di file di database. Le pagine vengono crittografate prima di essere scritte su disco e decifrate quando vengono rilette. Grazie all'ingombro ridotto e alle grandi prestazioni, è ideale per proteggere i database delle applicazioni incorporate e si adatta perfettamente allo sviluppo mobile.

  1. Blazing prestazioni veloci con un minimo di 5-15% overhead per crittografia su molte operazioni
  2. 100% dei dati nel file di database viene crittografato utilizza una buona sicurezza pratiche (modalità CBC, chiave di derivazione)
  3. Zero-configurazione e livello di applicazione di crittografia piattaforma ampia
  4. supporto: funziona con C/C++, Obj-C, QT, Win32/.NET, Java, Python, Ruby, ecc su Windows, Linux, iPhone/iOS ...
+6

come esattamente si arriva a lavoro da Python? – Michael

1

Ho avuto lo stesso problema. La mia applicazione potrebbe avere più istanze in esecuzione contemporaneamente. Per questo motivo, non posso solo crittografare il file sqlite db e averlo fatto. Inoltre, non credo che la crittografia dei dati in Python sia una buona idea, dal momento che non puoi effettuare alcuna seria manipolazione dei dati nel database con esso in questo stato.

Con questi vincoli in mente, ho fornito con le seguenti due soluzioni:

1) Utilizzare lo SQLCipher prima menzionato. I problemi che vedo qui, sono che dovrò scrivere i miei legami per Python e compilarlo da solo (o pagare la tassa). Potrei farlo in entrambi i casi in quanto sarebbe un'ottima soluzione per altri sviluppatori Python. Se avrò successo, rilascerò la soluzione.

2) Se l'opzione 1 è troppo difficile per me, o troppo tempo, userò questo metodo. Questo metodo non è sicuro. Userò pycrypto per crittografare il file del database. Implementerò un "server" SQL che decodificherà il file del database, quindi gestirà le richieste da vari client. Ogni volta che non ci sono richieste in sospeso, verrà reencrypt il database. Questo sarà più lento, soprattutto, e lascerà il database in stati temporali decrittografati.

Spero che queste idee aiutino il prossimo.

EDIT 1/13/2013

ho rinunciato a SQLCipher perché non riuscivo a farlo compilare, e il codice di base sta cercando di usare OpenSSL, che mentre una libreria di suoni, è piuttosto massiccio di una base di codice per AES 128 semplice.

Ho trovato un'altra opzione wxSQLite3 e ho scoperto come separare solo il pezzo di crittografia SQLite: https://github.com/shenghe/FreeSQLiteEncryption. Sono stato in grado di ottenere questo per compilare e lavorare (con l'ultima versione di SQLite3). wxSQLite3 supporta anche AES 256 che è davvero interessante. Il mio prossimo passo sarà tentare di compilare pysqlite (che è la libreria sqlite che viene creata in python) con sqlite3.dll modificato. Se funziona, ottimizzerò pysqlite per supportare il pezzo esteso di crittografia del sqlite3.dll di wxSQLite3. In ogni caso, cercherò di aggiornare questo thread con i miei risultati e, in caso di successo, pubblicherò la base di codice finale, con istruzioni di compilazione, su Github.

+0

eventuali aggiornamenti su questo? – Thomas

+0

Purtroppo il progetto è fallito e non ci sono mai riuscito. – shellster

2

Come suggerisce Frontware, è possibile utilizzare sqlcipher.

pysqlcipher Il pacchetto python può semplificare l'utilizzo poiché utilizza la combinazione di codice sqlcipher per compilare l'estensione.

Dovrebbe essere solo questione di usare pysqlcipher come si userebbe regolarmente sqlite.dbapi2, semplicemente impostando la corretta direttiva crypto.

Problemi correlati