Android - 在sqlite数据库中存储敏感数据

Pie*_*888 10 sqlite security encryption android

我需要将敏感数据存储在Android应用程序的sqlite数据库中.

我怎样才能确定这些数据是否安全?我知道我可以使用密钥加密数据,但是我在哪里存储该密钥?我也不想要求用户填写密钥,我只是想让它自己动手.因为我害怕逆向工程,所以我也不想在代码中加入加密密钥.

我发现了SQLCipher.它说这是加密数据库中数据的一种非常安全的方式,但为什么会这样呢?我还需要保留一把钥匙来解锁这些信息吗?或者这真的是确保数据安全的完美方式吗?

而如果不是,什么在SQLite数据库中存储的敏感数据的(几乎)防故障的方式?

小智 12

你说...

我也不想要求用户填写密钥,我只是想让它自己动手.因为我害怕逆向工程,所以我也不想在代码中加入加密密钥.

不幸的是,你需要做其中一件事(很可能).您可以向用户询问密码,然后使用为此目的设计的算法(即所谓的基于密码的加密 - PBE - 并且Android包括一些良好的PBE算法标准)从中导出密钥.您可以将密钥存储在代码中或作为APK中的资源存储,但是有人可以对其进行逆向工程.你可以这样做并混淆你的代码,这将减慢逆向工程过程,但你不能让它变得不可能(你的代码需要在某个时候确定密钥,所以这只是一个攻击者弄清楚它是如何做的问题它).

此处尝试过的其他方法包括强制客户端连接回服务器以通过网络检索密钥......但是如果网络连接中断会导致服务器将密钥输出给任何人,例如攻击者?好吧,那么你可以使用相互认证的SSL来确保只允许你的客户端获取它...但是你需要存储客户端SSL私钥...这就是你现在遇到的完全相同的问题.:)

所以......最重要的是你需要一个密钥(或类似的东西)来加密/解密数据.您可以存储它并使某人更难以对其进行逆向工程.您可以给用户带来不便,并让他们输入密码.但是......你需要某种秘密知识.

  • 我害怕你是对的,我选择使用PBKDF2方法Ranhiro Cooray提到所以我带着那个答案,但仍然很好的答案谢谢:) (2认同)

Ran*_*ray 9

对称加密需要加密密钥和相同的密钥才能解密.没有其他办法了.

不要将密钥存储在代码中,因为它可以被反编译(就像你说的那样).

在第一次使用时询问用户密码,并使用PBKDF2导出加密中使用的加密安全密钥.

用户必须输入密码,或者您需要将其存储在内存中.我要做的是,要求用户指定将密钥缓存在内存中以用于解密的持续时间.

如果持续时间到期,用户将不得不再次输入密码.

我没有彻底检查SQLCipher,但它说它使用AES-256.AES是一种对称加密算法,它需要一个加密密钥和相同的密钥才能解密.