【问题标题】:Android Authenticator STORE A CRYPTOGRAPHICALLY SECURE TOKENAndroid Authenticator 存储加密安全令牌
【发布时间】:2016-03-29 23:47:13
【问题描述】:
我正在使用海绵城堡 PKCS10CertificationRequest CSR 向 RESTful 证书颁发机构进行身份验证。
我正在考虑使用 Android Authenticator。
根据:https://stuff.mit.edu/afs/sipb/project/android/docs/training/id-auth/custom_auth.html#Security
重要的是要了解 AccountManager 不是加密
服务或钥匙串。它在您传递时存储帐户凭据
他们,在纯文本。在大多数设备上,这不是一个特别的问题,
因为它将它们存储在只能由 root 访问的数据库中。
但是在有根设备上,任何人都可以读取凭据
具有对设备的 adb 访问权限。
考虑到这一点,您不应将用户的实际密码传递给
AccountManager.addAccountExplicitly()。相反,您应该存储一个
加密安全的令牌,其用途有限
攻击者。
我的问题:
我不确定在这种情况下存储加密安全令牌是什么意思。
这个令牌在 Android Java 中是什么样的(它的类型?)?
以及存放在哪里?在钥匙串里??
除了 addAccountExplicitly() 中的 pw 之外,该令牌是否在任何其他上下文中使用?
【问题讨论】:
标签:
android
csr
spongycastle
authenticator
【解决方案1】:
如果您的设备具有丰富的输入功能(因此用户可以输入用户名\密码),您可能需要考虑使用 JWT auth 之类的东西。在这种情况下,您的应用程序永远不会保留实际的用户密码,而是在每个身份验证会话中仅将其发送到服务器一次并取回 JWT(JSON Web 令牌)。这是一个带有一些信息的令牌(例如,带有指向用户资源的链接 - id 或 uuid)和 TTL 参数,使用密钥进行安全签名。此密钥仅存在于服务器上,因此服务器之外的任何人都无法生成有效令牌。
因此,在身份验证请求之后,您可以在本地保存 JWT 并将其用于“授权”标头或作为请求字段(第一个选项更好,因为请求正文可以出现在日志中)与每个 API 查询一起使用。您应该在此令牌过期之前更新它,如果它已过期 - 然后要求用户再次输入他的凭据。从服务器端您收到一个请求,验证一个令牌(它是否使用服务器密钥签名并且它没有过期吗?)并且在有效令牌的情况下提供一个请求。您甚至不需要在服务器上保留令牌,但如果您想对身份验证进行更多控制 - 例如,如果您想从应用程序工作流程之外撤消令牌,则可能需要这样做。
在 JWT 网站上有一个列表,其中包含许多用于不同语言的 JWT 库。例如,要与 Elixir\Phoenix 一起使用,您可能需要使用 Guardian。在简单的情况下,从 Android 部分开始,您甚至不需要使用特殊工具来使用 JWT - 只需将令牌作为纯文本字符串放入“授权”标头并将请求发送到服务器即可。但是,如果您想获取(解码)您的服务器从应用程序端放入令牌的信息或检查令牌过期时间 - 那么您需要使用 jwt 网站上提供的库之一。