Android 验证器存储加密安全令牌

Android Authenticator STORE A CRYPTOGRAPHICALLY SECURE TOKEN

我正在使用 spongeycastle PKCS10CertificationRequest CSR 向 RESTful 证书颁发机构进行身份验证。 我正在考虑使用 Android 身份验证器。

根据:https://stuff.mit.edu/afs/sipb/project/android/docs/training/id-auth/custom_auth.html#Security

It's important to understand that AccountManager is not an encryption service or a keychain. It stores account credentials just as you pass them, in plain text. On most devices, this isn't a particular concern, because it stores them in a database that is only accessible to root. But on a rooted device, the credentials would be readable by anyone with adb access to the device.

With this in mind, you shouldn't pass the user's actual password to AccountManager.addAccountExplicitly(). Instead, you should STORE A CRYPTOGRAPHICALLY SECURE TOKEN that would be of limited use to an attacker.

我的问题: 我不确定在这种情况下 STORE A CRYPTOGRAPHICALLY SECURE TOKEN 是什么意思。 Android Java 中的令牌(它的类型?)是什么样的? 在哪里存储它?在钥匙串里?? 除了 addAccountExplicitly() 中的 pw 之外,该令牌是否用于任何其他上下文?

如果您的设备具有丰富的输入功能(因此用户可以输入 username\password),您可能需要考虑使用类似 JWT 的授权。在这种情况下,您的应用永远不会保留实际的用户密码,但每次身份验证 session 仅将其发送到服务器一次并取回 JWT(JSON 网络令牌)。这是一个带有一些信息的令牌(例如,带有 link 到用户资源 - id 或 uuid)和使用密钥安全签名的 TTL 参数。此密钥仅存在于服务器上,因此服务器外部的 body 无法生成有效令牌。

因此,在身份验证请求之后,您将 JWT 保存在本地并将其用于 "Authorization" header 或作为请求字段(第一个选项更好,因为请求 body 可以出现在日志中) 每个 API 查询。您应该在它过期之前更新此令牌,如果它已过期 - 然后要求用户再次输入他的凭据。从服务器端你得到一个请求,验证一个令牌(它是否用服务器密钥签名并且它没有过期?)并且在有效令牌的情况下服务请求。您甚至不需要将令牌保留在服务器上,但如果您想要更多地控制身份验证,您可能想要这样做 - 例如,如果您想要从应用程序工作流外部撤销令牌。

在 JWT 站点上有一个列表,其中包含许多适用于不同语言的 JWT 库。例如,要与 Elixir\Phoenix 一起使用,您可能希望使用 Guardian。从 Android 部分开始,在一个简单的情况下,您甚至不需要使用 JWT 的特殊工具 - 只需将令牌作为纯文本字符串放入 "Authorization" header 并发送请求到服务器。但是如果您想获取(解码)您的服务器从应用程序端放入令牌的信息或检查令牌过期时间 - 那么您将需要使用 jwt 网站上提供的库之一。