是否可以在没有设备PIN的情况下在ICS上使用android keystore守护程序?

时间:2014-02-06 16:49:11

标签: android security keystore

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

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

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

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

是否有一个更好的解决方案可以解决我没有看到的问题,或者它是否只能用于API版本< 18?

1 个答案:

答案 0 :(得分:4)

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

另一种方法是使用令牌,无论是您自己的令牌还是第三方身份提供商(Google,FB等)。