使用随机密钥通过AES加密本地凭据,我按照以下教程尝试安全地存储该密钥,然后能够在以后解密:
nelenkov.blogspot.co.uk storing applicationsecrets in androids
本教程介绍了如何访问系统密钥库并将密码存储在其中。
我面临的问题主要集中在对 UNLOCK ( android.credentials.UNLOCK )KeyStore的调用上。没有KeyStore初始化的设备(目前API低于14),他们正在显示一个请求8位密码的对话框。
该教程工作正常,但显示此对话框甚至只做一次,它会打扰大多数用户。
有没有办法跳过这个对话框?
如果有人描述了一种更好的方法来保持本地密钥,我会更高兴。
答案 0 :(得分:2)
8位数密码由您的自定义设备固件或设备管理员强制执行。大多数设备都没有这样的要求。如果想要安全存储某些内容,您必须拥有PIN码,Android会使用它来获取加密密钥。其他选项是自己从您的输入中获取一个键:您可以控制对话的时间和键的缓存,但它是相同的过程。最后,您只需生成一个主密钥并将其存储为私人文件,其他应用程序无法读取它,因此您可以在非root设备上使用。这是Android开发者博客上推荐的方法:
http://android-developers.blogspot.jp/2013/02/using-cryptography-to-store-credentials.html
答案 1 :(得分:2)
KeyStore
不仅可以锁定在预ICS设备上。获取KeyStore
的最简单方法是:
设备启动后,KeyStore
将被锁定。 com.android.credentials.UNLOCK
意图会启动com.android.settings.CredentialStorage
活动,而活动会显示UnlockDialog
,提示您输入密码。
* KeyStore: LOCKED
* KeyGuard: OFF/ON
* Action: old unlock dialog
* Notes: assume old password, need to use it to unlock.
* if unlock, ensure key guard before install.
* if reset, treat as UNINITALIZED/OFF
5次尝试输入错误密码后, KeyStore
重置。但重置KeyStore实际上并没有将其关闭或取消初始化。 KeyStore保持锁定状态,取消初始化它的唯一方法似乎是com.android.credentials.RESET
。但这将重置KeyStore和KeyChain(用户安装的证书)。
如果要在没有用户确认的情况下静默重置KeyStore和KeyChain,可以通过绑定到IKeyChainService
并调用其reset()
方法来实现。
但我不建议这样做。更好的解决方案是显示一些通知消息,要求用户手动设置屏幕锁定