2014-02-06 20 views
1

我一直在使用Nikolay Elenkov的博客(http://nelenkov.blogspot.com/2012/05/storing-application-secrets-in-androids.html)在我们的android应用程序中存储加密的密码信息。要求是这样的,我们a)不想直接在我们的代码中存储密钥/盐,因为这可以被反编译/删除,b)需要支持回到android API级别14,以及c)需要存储密码(加密的)信息(即目前不能使用OpenAuth令牌或类似的系统,因为它需要现在无法进行的服务器更改)。是否可以在没有设备PIN码的ICS上使用android密钥库守护程序?

因此,在JB 4.2+设备上,我可以利用新的安全凭证存储,这不会导致任何问题。但是,对于JB 4.1和ICS设备,我需要使用上述通过nelenkov技术与密钥库守护进程交互的方法。

这里的问题是,当所述安全凭证存储被初始化时,它需要用户设置设备密码/ PIN,因为它使用这个到基座用于主存储关的加密密钥。这是一种糟糕的交易,因为这对用户来说是一个很大的障碍。

或者,我已经看过使用基于SpongyCastle的单独密钥存储区。但是,这个方向的问题是我需要用一些密码来初始化它(可能存储在我的源代码中)。这意味着,如果设备被盗/植入,获取“安全”密钥存储区的内容相对容易,因为可以从应用程序的反编译源中检索密码。

有没有更好的解决方案,我没有看到这个问题,或者它只是不可能与API版本< 18?

回答

4

其实只有两种方法可以做到这一点:无论是用户输入某种密码,你从中获得你的密钥,或生成一个密钥并将其存储在设备上。使用设备解锁密码比用户只记住您的应用的专用密码更方便用户。顺便说一句,在4.2 +你仍然需要一个锁屏密码,所以没有什么比4.0更改。像往常一样,如果该设备是根植的,攻击者可以获取用户的Google身份验证令牌,并强制实施锁屏密码,这样您就会遇到更大的问题。所以首先想想你的威胁模型,然后决定你愿意走多远。如果数据真的很敏感,请使用每次打开应用程序时都需要输入的足够复杂的专用密码。您也可以编写设备管理员并要求设备已加密,锁屏PIN /密码足够长/复杂等。

另一种方法是使用令牌,您自己或第三方身份提供者(Google,FB等)。

+0

好了,我不能说我喜欢的答案,但我并不感到惊讶。 :)感谢您花时间讨论这个问题,但尼古拉,我真的很感激博客文章。 – jwir3

相关问题