2010-04-03 16 views
9

Ecco il problema: Nel mio progetto Qt4.6, utilizzo un database SQLite. Questo database non dovrebbe essere non criptato sul mio hard disk. Quindi voglio che ad ogni avvio del mio programma venga chiesto all'utente di inserire una password per decrittografare il database. Ovviamente il database non dovrebbe mai apparire "in chiaro" (non crittografato) sul mio hard disk.
Quindi esiste la possibilità di decodificare un database SQLite "al volo" e leggere e scrivere dati? Quale algoritmo è qui il migliore (forse AES)?
Quando non è possibile (o molto lento), forse è meglio crittografare ogni stringa nel database e decrittografare la stringa quando la password è corretta (in modo che un utente possa aprire il database, ma non ha idea di cosa potrebbero fare tutti gli accessi significare)?Codifica/decodifica il database SQLite e usalo "al volo"

risposta

11

Non è presente un supporto integrato, in base al quale si dispone di opzioni.

1) È possibile crittografare/decrittografare tutte le stringhe da soli, ma è molto lavoro, non è trasparente e non consente di eseguire operazioni come la ricerca nel database.

2) SQLiteCrypt e SQLCipher fare ciò che stai cercando.

È possibile utilizzarli quasi completamente trasparenti e in genere si dice che abbiano solo circa il 5% di spese generali rispetto senza crittografia.

+0

ma quando uso un'API diversa, non ho più "usabilità" di Qt e SQLite, giusto? – Berschi

+1

@Berschi: Probabilmente dovresti ricostruire il componente sqlite in Qt ma forniscono l'origine per esigenze come questa. Penso che provare a utilizzare uno di questi componenti sia la soluzione migliore. –

+0

Dovresti essere in grado di utilizzare il driver sqllite e compilarlo rispetto al sqllite fornito da SqlLitCrypt o SQLCipher. Probabilmente potresti incorporare parte della funzionalità della password nella stringa di connessione, oppure estendere la classe del driver e chiamare direttamente il driver per le funzioni estese –

2

Il modo migliore a cui pensare è utilizzare FUSE - "filesystem in user-land" - disponibile per Linux, Mac OS X e altri sistemi o un diverso sistema di file crittografato. Questo renderà SQLite visibile come non criptato mentre viene fisicamente crittografato sul disco. Giocando con le autorizzazioni è possibile assicurarsi che le persone non possano accedere al file system non crittografato.

Non sono sicuro che SQLite sia in grado di scavalcare le routine di lettura/scrittura di basso livello che consentiranno di implementare la crittografia al volo senza giochi di filesystem. Almeno non ho mai avuto bisogno di farlo. Potresti voler cercare una richiesta di questa funzionalità e archiviarne una se non si trova nel tracker dei problemi di SQLite.

1

Un'opzione aggiuntiva sarebbe il codec di codifica SQLite fornito con Botan 1.9.x (src/wrap/sqlite).

Questa opzione consente di personalizzare il tipo di crittografia al momento della compilazione, inclusi il codice e la modalità.

Disclosure: Ho contribuito con il codec a Botan.