我需要将敏感数据存储在Android应用程序的sqlite数据库中。
我如何确定这些数据非常安全? 我知道我可以使用密钥加密数据,但是我在哪里存储该密钥?我也不想要求用户填写密钥,我只是想让它自己动手。 因为我害怕逆向工程,所以我也不想在代码中加入加密密钥。
我发现了SQLCipher。它说这是加密数据库中数据的一种非常安全的方式,但为什么会这样呢?我还需要保留一把钥匙来解锁这些信息吗?或者这是确保数据安全的完美方式吗?
如果不是,那么 是一种(几乎)防病毒的方式在sqlite数据库中存储敏感数据?
答案 0 :(得分:12)
你说......
我不想要求用户填写密钥,我只是想要它 自己动手。因为我害怕逆向工程我 不想在代码中加入加密密钥。
不幸的是,你需要做其中一件事(很可能)。您可以向用户询问密码,然后使用为此目的设计的算法(即称为基于密码的加密 - PBE - 并且Android包含一些良好的PBE算法标准)从中导出密钥。您可以将密钥存储在代码中或作为APK中的资源存储,但是有人可以对其进行逆向工程。你可以这样做并混淆你的代码,这将减慢逆向工程过程,但你不能让它变得不可能(你的代码需要在某个时候确定密钥,所以这只是一个攻击者弄清楚它是如何做的问题它)。
此处尝试过的其他方法包括强制客户端连接回服务器以通过网络检索密钥......但是如果网络连接中断会导致服务器将密钥输出到任何人,像攻击者?好吧,那么你可以使用相互认证的SSL来确保只允许你的客户端获取它...但是你需要存储客户端SSL私钥...这就是你现在遇到的完全相同的问题。 :)
所以......最重要的是你需要一个密钥(或类似的东西)来加密/解密数据。您可以存储它并使某人更难以对其进行逆向工程。您可以给用户带来不便,并让他们输入密码。但是......你需要某种秘密知识。
答案 1 :(得分:9)
对称加密需要加密密钥和相同的密钥才能解密。没有办法解决它。
不要将密钥存储在代码中,因为它可以被反编译(就像你说的那样)。
在第一次使用时询问用户密码,并使用PBKDF2导出加密中使用的加密安全密钥。
用户必须输入密码,或者您需要将其存储在内存中。我要做的是,要求用户指定将密钥缓存在内存中以用于解密的持续时间。
如果持续时间已过期,则用户必须再次输入密码。
我没有彻底检查SQLCipher,但它说它使用AES-256。 AES是一种对称加密算法,它需要一个加密密钥和相同的密钥才能解密。
答案 2 :(得分:1)
是否可以让应用自动生成随机密码?可能来自地点,时间或其他信息,这不需要询问用户的通行证。