2012-03-18 59 views
1

我有,我已經添加導出/導入DB功能的應用程序......我想要做的兩件事情:驗證導入之前SQLite數據庫到Android應用

1)導出時:擾亂出口數據庫,以便正常人(我知道有些人可以解碼最好的僞裝技術)無法讀取內容...

2)導入時:驗證正在導入的文件,以確保它可以與我的應用程序一起工作,沒有別的。

我在這裏看到了一些關於加密的鏈接,可以解決第一點。但我不想做加密。我想做一些簡單的加擾。我已經看到一些關於通過檢查我的應用程序查找表來驗證表內容的文章。這是一個很好的解決方案,但我需要首先加載文件以驗證並在出現錯誤時回滾。

任何幫助將不勝感激......

回答

0

因此,我最終決定使用cipherinputstream進行DES加密,而不是添加一個頭來驗證完整性,我檢查是否所有表名都存在於正在導入的文件中。我看到sqlite數據庫文件具有明文形式的ddl語句。這可能不是最優雅/完整的解決方案,但它的工作原理。

1

非常非常簡單的方法:添加一些頭,你可以稍後讀回,並檢查文件:

// w/o exception handling finally etc 
String secret = "zomg,secret"; 
byte[] header = secret.getBytes(); 
byte[] buffer = new byte[4096]; 
FileInputStream in = new FileInputStream("/your/sqlite.db"); 
FileOutputStream out = new FileOutputStream("/sdcard/the.secretfile"); 
out.write(header); 
int read = 0; 
while ((read = in.read(buffer)) != -1) { 
    out.write(buffer, 0, read); 
} 
out.close(); 
in.close(); 
+0

謝謝..我想過這個方法...但是想在我去之前檢查一下是否有更好的東西.. – Sriman 2012-03-18 13:21:48

+0

你也可以寫一些擴展到'InputStream'和'OutputStream'來做一些加密/加擾。或者將所有這些包裝在eghttp://docs.oracle.com/javase/1.4.2/docs/guide/security/jce/JCERefGuide.html#CipherInput – zapl 2012-03-18 13:36:08

+0

謝謝...所以我最終決定使用cipherinputstream進行DES加密而不是添加一個頭來驗證完整性,我檢查是否所有我的表名都存在於正在導入的文件中。我看到sqlite數據庫文件具有明文形式的ddl語句。 – Sriman 2012-03-19 04:12:08

0

最好的和簡單的方法處理這個問題的方法是生成數據庫文件的校驗和(MD5),並與您的計算結果進行比較。 For more info

+0

謝謝。我認爲MD5會根據文件中的數據而有所不同。我如何預先計算它與正在導入的文件生成的MD5進行比較.... – Sriman 2012-03-18 13:18:01

+0

只需首先計算您的MD5(http://www.softpedia.com/get/Security/Encrypting/TS-MD5-Generator .shtml)並將結果保存在您的代碼中進行比較。稍後,當數據庫被保存/複製到SD卡上時,請重新生成其MD5並將其與代碼中的MD5進行比較。請參閱我的答案中的鏈接,以編程方式生成MD5 – waqaslam 2012-03-18 15:01:04

+0

我認爲您錯誤地理解了我的要求。我將要導出/導入的數據庫是可變的。根據用戶的使用方式,它可以從安裝更改爲安裝。所以我永遠不能在代碼中保存一個常量MD5並將其用於比較目的。 – Sriman 2012-03-18 21:55:08