2011-01-07 18 views
5

Ho creato un paio di DLL dalla sorgente. Sono principalmente dalla stessa fonte, sqlite-3.6.22, Open SSL 0.9.8 e sqlcipher.Crittografia SQLite diversa tra piattaforme

Il motivo per cui ho creato due era che ne avevo bisogno uno per lavorare con un progetto C++ e uno come un driver JDBC per java (quindi una java jni dll).

Ora ho le due DLL, posso scrivere e creare database in C++ e C# (utilizzando il C uno), e lo stesso in Java. Entrambi rispondono come mi aspetterei, è possibile aprirli se si fornisce la password corretta, fallisce se si fornisce quella sbagliata, ecc. In teoria dovrebbe essere l'impostazione predefinita per sqlcipher, che è codificata su aes-256- CBC. Tuttavia, non posso aprire un database creato con uno con l'altro. Posso aprire un database creato con la versione c in SQLite3 Management studio, ma solo se metto la password con RSA selezionata, non posso aprire quella creata in java in qualsiasi altra cosa abbia.

L'altra cosa è che se creo due database con contenuti identici con il database c, sono byte per byte identici, mentre quelli java no.

Sono sicuro che sto facendo qualcosa di ovvio, ma non riesco davvero a vederlo - per quanto posso vedere il java sta funzionando bene (più facile eseguire il debug per qualche motivo).

+0

Scusa l'errore tremendo di "differenze" per favore! – Woody

+0

Non sono sicuro che la mia domanda sia pertinente. È possibile creare due database non crittografati con Java identici byte per byte? –

+0

Ho corretto il tuo errore di battitura! – CraigTP

risposta

1

Dopo aver lasciato un po 'di tempo, dato che era piuttosto frustrante, ci siamo ripresi oggi. Il debug di sqlite3.dll mi dà la risposta.

Se si accede tramite JDBC in Java, non si dispone delle funzioni chiave per una password byte [], quindi è necessario immettere la password tramite il tasto PRAGMA = '' in una dichiarazione. Dalla documentazione risulta che questi sono equivalenti e che se hai bisogno di una chiave binaria, la si codifica esadecimale e si mette "x" davanti. Quindi in Java avevo:

PRAGMA key="x'899e7c6475756d887a759a93a0a3979a62827e85919898a49394a29c7b88aa8a" 

mentre in C# stavo usando quelle cifre binarie in un array di byte.

Si scopre che la stringa viene utilizzata letteralmente come password, una password di 42 caratteri.

Quindi posso creare un database in java e leggerlo in C# e viceversa, usando i metodi pragma o chiave, purché non voglia una password binaria, che non posso usare in java.

Indovina quale metodo avevo bisogno!

+0

Sono sulla stessa barca come te adesso. Come hai creato un database sqlite crittografato accessibile tramite JDBC e C#? –