6

一段时间以来,我一直在 google 上搜索有关应用程序密码和 SQLite 安全性的信息,但我发现的任何内容都没有真正回答我的问题。

这是我想要弄清楚的:

1) 我的应用程序将有一个可选的密码活动,该活动将在首次打开应用程序时调用。我的问题是 a) 如果我通过 android 首选项或 SQLite 数据库存储密码,如何确保密码的安全性和隐私性,以及 b) 应如何处理密码恢复?

关于上面的b),我考虑过在启用密码功能时需要一个电子邮件地址,以及在请求密码恢复时使用的密码提示问题。成功回答提示问题后,密码将通过电子邮件发送到提交的电子邮件地址。我对电子邮件方法的安全性和隐私性并不完全有信心,尤其是当用户连接到开放的公共无线网络时发送电子邮件时。

2)我的应用程序将使用一个 SQLite 数据库,如果用户有一个,它将存储在 SD 卡上。无论是存储在手机上还是 SD 卡上,我有哪些数据加密选项,这对应用程序性能有何影响?

提前感谢您花时间回答这些问题。我认为可能还有其他开发人员在为同样的问题而苦苦挣扎。

4

1 回答 1

4

1) 密码恢复是危险的。密码的强度被问题的答案所破坏,这是最薄弱环节的主要部分。 由于这个(非常)不安全的功能,Sara Palin 的电子邮件黑客成为可能。此外,如果您以“可恢复格式”存储密码,例如 AES 等分组密码或 RC4 等流密码或 RSA 等非对称密码,那么您显然违反了CWE-257。如果你真的需要这个功能,你必须要求用户重置他们的密码,如果他们不知道,那你为什么要告诉他们呢?

必须始终使用安全消息摘要对密码进行哈希处理。目前许多消息摘要功能是不安全的,md4、md5、sha0 和 sha1 都非常损坏,不应该用于密码。目前使用 sha2 家族的任何成员都是最好的功能,我推荐 SHA-256。NIST 目前正在举办一场 sha3 竞赛,直到 2012 年某个时候才能最终确定。

密码也必须用大的随机值“加盐”。这可能是您数据库中的另一列,然后将其附加到纯文本密码,然后再将其传递给您的消息摘要函数。这使得字典攻击不可能,除非攻击者能够获得盐,它也使得预先计算的攻击更加资源密集,以成功进行。尽管众所周知,盐渍并不能阻止彩虹桌,它只是意味着你需要一套更大的彩虹桌。

2)你打算把你的加密数据库的密钥放在哪里?Sqlite 只是一个文件,您可以对其进行加密,然后在应用程序启动时对其进行解密,这只会增加一些加载时间,但在运行时它会一样快。真正的问题是绝对没有地方可以在设备上放置攻击者无法获得的秘密。攻击者比你对设备有更多的控制权,攻击者可以越狱设备并为所欲为。即使密钥是在运行时传输的,它仍然可以通过查看设备的内存来获得。任何加密数据库的努力都可能被破坏,它可能会使其变得更加困难,但它不会阻止熟练的黑客。

于 2010-04-23T00:08:35.250 回答