【发布时间】:2013-02-13 09:11:32
【问题描述】:
Android 应用程序的 SQLCipher 究竟是如何工作的? http://sqlcipher.net/design/
据我了解,这一切都取决于 PRAGMA 密钥,并且此密钥应保存在应用程序中,可能以二进制形式保存。
但是这是不安全的,因为几乎每个人都可以在 root 手机上反编译 .apk 文件。 也许我错过了什么?
谢谢。
【问题讨论】:
Android 应用程序的 SQLCipher 究竟是如何工作的? http://sqlcipher.net/design/
据我了解,这一切都取决于 PRAGMA 密钥,并且此密钥应保存在应用程序中,可能以二进制形式保存。
但是这是不安全的,因为几乎每个人都可以在 root 手机上反编译 .apk 文件。 也许我错过了什么?
谢谢。
【问题讨论】:
据我所知,这一切都取决于 PRAGMA 密钥,并且此密钥应保存在应用程序中,可能以二进制形式保存。
没有。
也许我错过了什么?
密钥来自用户,以用户输入的密码短语的形式。在 SQLCipher for Android 中,此密码短语被传递给 SQLiteOpenHelper 修订版上的 getReadableDatabase() 等方法。
【讨论】:
是的,保护密钥是棘手的部分。理想情况下,它(部分)由用户在登录应用程序时输入的密码提供,但这并不总是理想的,因此有时您必须诉诸备受诟病的“默默无闻的安全性”方法并从位组装密钥以及到处藏匿的碎片。
【讨论】:
SQLCipher 团队普遍建议不要在应用程序二进制文件中嵌入固定密钥。无论应用程序在隐藏嵌入式密钥方面多么有创意,一个足够坚定的攻击者都能够从应用程序包中提取它并打开数据库。
不幸的是,一些应用程序仍然选择使用带有嵌入式密钥的 SQLCipher 作为 DRM 的基本形式,即让临时用户难以查看数据。然而,这并没有提供任何实质性的安全性。
如果您需要保护敏感数据,最好的方法是使用源自用户输入的强密码的密钥。 SQLCipher 自动提供强密钥派生,因此您只需通过 PRAGMA 密钥或 SQLCipher 包装库中提供的等效密钥机制之一提供用户密码。
【讨论】:
我生成密钥形式 secureRandom 然后将密钥保存在 KeyStore (BKS) 上。 对于 KeyStore,我使用以下方式生成密码:随机、用户信息、设备信息和密码。
【讨论】: