如何在Android中安全地存储访问令牌和秘密?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (15)

我将使用oAuth从谷歌获取邮件和联系人。我不想每次都要求用户登录以获取访问令牌和秘密。根据我的理解,我需要将它们与我的应用程序一起存储在数据库中SharedPreferences。但我有点担心安全问题。我读过你可以对令牌进行加密和解密,但攻击者很容易只是反编译你的apk和类并获得加密密钥。 在Android中安全存储这些令牌的最佳方法是什么?

提问于
用户回答回答于

将它们存储为共享首选项。这些默认情况下是私人的,其他应用程序无法访问它们。在根植设备上,如果用户明确允许访问正在尝试阅读它们的某个应用程序,该应用程序可能可以使用它们,但无法防止这种情况发生。至于加密,你必须要求用户每次都输入解密密码(这样做会破坏缓存凭证的目的),或者将密钥保存到文件中,你也会遇到同样的问题。

存储令牌的好处不在于实际的用户名密码:

  • 第三方应用程序不需要知道密码,用户可以确保只将它发送到原始网站(Facebook,Twitter,Gmail等)
  • 即使有人盗取了令牌,也无法查看密码(用户也可能在其他网站上使用该密码)
  • 令牌通常具有一定的寿命,并在一段时间后过期
  • 如果您怀疑他们已被盗用,可以撤销令牌
用户回答回答于

你可以将它们存储在AccountManager中。根据这些人,这被认为是最好的做法:

另一种选择是使用隐藏库。对于Facebook来说这已经足够安全,并且比AccountManager更容易使用。这是使用Conceal保存秘密文件的代码片段:

byte[] cipherText = crypto.encrypt(plainText);
byte[] plainText = crypto.decrypt(cipherText);

扫码关注云+社区