我有一些敏感数据存储在SQLite中,适用于Android应用。我需要能够在持久化时加密,但在从数据库反序列化时也需要解密。不确定我在Android上的选项是什么?
答案 0 :(得分:5)
Android中没有内置加密数据库内容的功能。您可以自己加密/解密值并将加密的材料存储在数据库中,但这取决于您,并且必须逐个单元地完成。
对于加密算法,Android内置了javax.crypto
。
另外,请记住,如果您的加密密钥已粘贴到您的应用程序中,任何关心的人都可以通过您的加密。
答案 1 :(得分:1)
您可能需要查看有关读取/写入受密码保护的zip文件的this SO question。它包含一些指向执行这些任务的OSS库的链接。虽然您不一定对压缩感兴趣,但这可能会解决在启动时解密db的问题,然后您可以简单地将修改后的数据库写回加密文件。
@CommonsWare绝对正确,将密码/密钥烘焙到您的应用程序意味着真正想要的人可以获取您的数据。但是,我认为这会阻止大多数人通过琐碎的方式刷数据。
答案 2 :(得分:1)
这里没有简单的答案。猜猜我只是使用简单的东西来序列化时破坏列值。
答案 3 :(得分:0)
如果您需要加密数据库,您可能会使用登录到您的应用程序以确保安全性,对吗?为什么不让您的登录服务器存储加密的“密码”,登录后,拉出“密码”并存储代码(在公共字符串中,而不是实际文件或首选项)。这样,如果某人反编译您的应用,他们仍然无法解密数据,您的数据将是安全的。
然后使用:
每次应用程序卸载时,在Destroy()
上清除代码。
答案 4 :(得分:0)
尝试SQLCipher加密数据库..
答案 5 :(得分:-2)
您可以尝试在SHA1中加密
public static String encriptSHA1(String password){
String hash = "";
try {
MessageDigest md;
byte[] buffer, digest;
buffer = password.getBytes();
md = MessageDigest.getInstance("SHA1");
md.update(buffer);
digest = md.digest();
for(byte aux : digest) {
int b = aux & 0xff;
if (Integer.toHexString(b).length() == 1) hash += "0";
hash += Integer.toHexString(b);
}
} catch (NoSuchAlgorithmException e) {
}
return hash;
}