【问题标题】:Android - Storing sensitive data in the sqlite databaseAndroid - 在 sqlite 数据库中存储敏感数据
【发布时间】:2012-03-19 21:06:39
【问题描述】:

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

如何确保这些数据非常安全? 我知道我可以使用密钥对数据进行加密,但我在哪里存储该密钥?我也不想让用户填写密钥,我只想让它自己工作。 因为我害怕逆向工程,我也不想在代码中放入加密密钥。

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

如果不是,那么是在 sqlite 数据库中存储敏感数据的(几乎)防故障方法吗?

【问题讨论】:

    标签: android security sqlite encryption


    【解决方案1】:

    对称密码术需要一个密钥来加密和相同的密钥来解密。没有办法解决。

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

    在第一次使用时询问用户密码并使用PBKDF2 派生加密安全密钥以用于加密。

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

    如果期限到期,用户将不得不再次输入密码。

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

    【讨论】:

    • 我采用了这个解决方案,每次启动/打开应用程序时我都会向用户询问一个密码,我将根据该密码创建我的密钥,并在应用程序再次关闭时丢弃它
    【解决方案2】:

    是否可以让应用程序自动生成随机密码?可能是从地点、时间或其他信息生成的,这将不需要询问用户的通行证。

    【讨论】:

      【解决方案3】:

      你说...

      我也不想让用户填写密钥,我只是想要它 自己工作。因为我害怕逆向工程我 也不想在代码中放入加密密钥。

      不幸的是,您需要做这些事情之一(嗯,可能)。您可以要求用户输入密码,然后使用为此目的设计的算法(称为基于密码的加密 - PBE - Android 包含一些良好的 PBE 算法标准)从中派生密钥。您可以将密钥存储在您的代码中或作为 APK 中的资源,但随后有人可以对其进行逆向工程。你可以这样做并混淆你的代码,这会减慢逆向工程过程,但你不能让它变得不可能(你的代码需要在某个时候确定密钥,所以这只是攻击者弄清楚它是如何做的它)。

      这里尝试过的其他方法包括强制您的客户端连接回服务器以通过网络检索密钥......但是如果网络连接中断会发生什么以及阻止服务器将密钥提供给任何人,比如攻击者?好吧,那么您可以使用相互验证的 SSL 来确保只允许您的客户端获取它...但是您需要存储客户端 SSL 私钥...这与您现在遇到的问题完全相同。 :)

      所以...底线是您需要一个密钥(或等效的东西)来加密/解密数据。您可以将其存储起来,让别人更难对其进行逆向工程。您可以给用户带来不便,让他们输入密码。但是……你不知何故需要那种秘密知识。

      【讨论】:

      • 恐怕你是对的,我选择使用 Ranhiro Cooray 提到的 PBKDF2 方法,所以我选择了那个答案,但仍然是很好的答案,谢谢 :)
      猜你喜欢
      • 1970-01-01
      • 2017-11-26
      • 2020-10-27
      • 2021-11-14
      • 2012-03-28
      • 2017-09-05
      • 2020-02-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多