首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Android中安全地存储访问令牌和密钥?

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

Stack Overflow用户
提问于 2012-04-15 18:38:38
回答 4查看 81.3K关注 0票数 136

我将使用oAuth从谷歌获取邮件和联系人。我不想每次都要求用户登录以获取访问令牌和密码。据我所知,我需要将它们与我的应用程序一起存储在数据库或SharedPreferences中。但我有点担心安全方面的问题。我读到你可以加密和解密令牌,但攻击者很容易只需反编译你的apk和类,并获得加密密钥。

在安卓中安全存储这些令牌的最好方法是什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-04-16 00:03:53

将它们存储为shared preferences。默认情况下,这些是私有的,其他应用程序无法访问它们。在有根的设备上,如果用户明确允许访问正在尝试读取它们的应用程序,则该应用程序可能能够使用它们,但您无法阻止这一点。至于加密,您必须要求用户每次都输入解密密码(从而违背了缓存凭据的目的),或者将密钥保存到文件中,您将得到相同的问题。

存储令牌而不是实际的用户名密码有几个好处:

  • 第三方应用程序不需要知道密码,用户可以确保仅将密码发送到原始站点(Facebook、Twitter、Gmail等)
  • 即使有人窃取令牌,他们也看不到密码(用户可能也在其他站点上使用)
  • 令牌通常具有生存期并在一段时间后过期如果您怀疑令牌已被泄露
  • 令牌可被撤销

<代码>F210

票数 128
EN

Stack Overflow用户

发布于 2017-03-15 01:09:52

您可以将它们存储在AccountManager中。根据这些人的说法,这被认为是最佳实践。

以下是官方定义:

此类提供对用户在线帐户的集中注册表的访问。用户为每个帐户输入一次凭据(用户名和密码),通过“一键”批准授予应用程序对在线资源的访问权限。

有关如何使用AccountManager的详细指南,请参阅:

但是,最终AccountManager只将您的令牌存储为纯文本。因此,我建议在将您的秘密存储到AccountManager之前对其进行加密。您可以利用各种加密库,如AESCryptAESCrypto

另一种选择是使用Conceal library。它对Facebook来说足够安全,而且比AccountManager更容易使用。下面是使用隐藏保存秘密文件的代码片段。

代码语言:javascript
复制
byte[] cipherText = crypto.encrypt(plainText);
byte[] plainText = crypto.decrypt(cipherText);
票数 26
EN

Stack Overflow用户

发布于 2018-03-01 17:13:25

SharedPreferences is not本身就是一个安全的位置。在一个有根的设备上,我们可以很容易地读取和修改所有应用程序的SharedPrefereces xml,所以令牌应该相对频繁地过期。但是,即使每小时有一个令牌过期,仍有可能从SharedPreferences窃取较新的令牌。安卓KeyStore应该用于长期存储和检索密钥,这些密钥将用于加密我们的令牌,以便将它们存储在例如SharedPreferences或数据库中。密钥不存储在应用程序的进程中,因此它们可能会被are harder泄露。

因此,比地点更相关的是它们如何本身是安全的,例如,使用加密签名的短寿命JWTs,使用Android KeyStore加密它们,并使用安全协议发送它们。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10161266

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档