2011-01-07 59 views
5

我已經從源代碼構建了幾個dll。他們主要來自同一個源碼,sqlite-3.6.22,Open SSL 0.9.8和sqlcipher。不同平臺之間的SQLite加密

我建立兩個的原因是我需要一個用於處理C++項目,另一個作爲java的JDBC驅動程序(所以java jni dll)。

現在我有兩個DLL,我可以在C++和C#中編寫和創建數據庫(使用C),而在java中也是一樣。這兩種響應都如我所料,如果您提供正確的密碼,您可以打開它們,如果您輸入錯誤的密碼,則會失敗。 這兩個理論上都應該是sqlcipher的默認設置,它被硬編碼爲aes-256- CBC。 但是,我無法打開一個與另一個做的數據庫。我可以在SQLite3 Management Studio中打開使用c版本創建的數據庫,但是隻有當我將密碼與RSA選中後,我才能打開在java中創建的任何其他數據庫。

另一件事是,如果我使用c數據庫製作兩個具有相同內容的數據庫,它們是字節相同的字節,而java的則不是。

我相信我做的東西很明顯錯了,但是我真的不能看到它 - 據我可以看到Java的一個工作正常(更容易調試出於某種原因)。

+0

請原諒'不同'的可怕錯字! – Woody 2011-01-10 09:14:36

+0

不確定我的問題是否相關。您可以使用Java創建兩個字節一致的未加密數據庫嗎? – 2011-01-17 14:36:40

回答

1

離開這一段時間後,因爲這很令人沮喪,今天又回到了它。 調試sqlite3.dll給了我答案。

如果要通過JDBC在Java中訪問它,你不必爲一個byte []密碼鍵的功能,所以需要通過在一份聲明PRAGMA鍵=「」輸入密碼。從文檔看來,這些是等同的,如果你需要一個二進制密鑰,你可以用十六進制編碼,並把「x」放在前面。所以在Java我有:

PRAGMA key="x'899e7c6475756d887a759a93a0a3979a62827e85919898a49394a29c7b88aa8a" 

而在C#中,我在字節數組中使用這些二進制數字。

原來,該字符串被字面上用作密碼,是一個42個字符的密碼。

所以我可以在java中創建一個數據庫並在C#中讀取數據庫,反之亦然,只要我不想使用二進制密碼,我不能在java中使用該密碼。

猜猜我需要哪種方法!