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

时间:2016-03-29 23:47:14

标签: android csr spongycastle authenticator

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

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

  

了解AccountManager不是加密非常重要   服务或钥匙串。它会在您通过时存储帐户凭据   他们,纯文本。在大多数设备上,这不是特别关注的问题,   因为它将它们存储在只能由root访问的数据库中。   但是在root设备上,任何人都可以读取凭据   使用adb访问设备。

     

考虑到这一点,您不应该将用户的实际密码传递给   AccountManager.addAccountExplicitly()。相反,你应该存储一个   对于一个有限的使用的密码安全令牌   攻击者。

我的问题: 在这种情况下,我不确定存储加密数据安全令的含义。 在Android Java中,该标记是什么样的(它的类型?)? 在哪里存放?在KeyChain ?? 除了addAccountExplicitly()中的pw之外的任何其他上下文中是否使用该标记?

1 个答案:

答案 0 :(得分:0)

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

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

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