2012-03-18 40 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

相关问题