0

我正在使用海绵城堡 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 之外,该令牌是否在任何其他上下文中使用?

4

1 回答 1

0

如果您的设备具有丰富的输入功能(因此用户可以输入用户名\密码),您可能需要考虑使用JWT auth 之类的东西。在这种情况下,您的应用程序永远不会保留实际的用户密码,而是在每个身份验证会话中仅将其发送到服务器一次并取回 JWT(JSON Web 令牌)。这是一个带有一些信息的令牌(例如,带有指向用户资源的链接 - id 或 uuid)和 TTL 参数,使用密钥进行安全签名。此密钥仅存在于服务器上,因此服务器之外的任何人都无法生成有效令牌。

因此,在身份验证请求之后,您可以在本地保存 JWT 并将其用于“授权”标头或作为请求字段(第一个选项更好,因为请求正文可以出现在日志中)与每个 API 查询一起使用。您应该在此令牌过期之前更新它,如果它已过期 - 然后要求用户再次输入他的凭据。从服务器端你收到一个请求,验证一个令牌(它是用服务器密钥签名的,它没有过期吗?),如果是有效的令牌,则提供一个请求。您甚至不需要在服务器上保留令牌,但如果您想要更多地控制身份验证,您可能想要这样做 - 例如,如果您想从应用程序工作流程之外撤消令牌。

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

于 2016-05-19T04:40:00.090 回答