当前位置: 首页 > 知识库问答 >
问题:

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

宓昂雄
2023-03-14

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

共有3个答案

晋奕
2023-03-14

SharedReferences本身不是一个安全的位置。在根设备上,我们可以轻松读取和修改所有应用程序的SharedPreferes xml。因此令牌应该相对频繁地过期。但即使令牌每小时过期一次,更新的令牌仍然可以从SharedReference中被盗。Android密钥库应用于长期存储和检索加密密钥,这些密钥将用于加密我们的令牌,以便将它们存储在共享引用或数据库中。密钥不存储在应用程序的进程中,因此很难被泄露。

因此,比一个地方更重要的是它们自身如何安全,例如使用加密签名的短期JWT,使用Android密钥库对它们进行加密,并使用安全协议发送它们

魏彦
2023-03-14

您可以将它们存储在帐户管理器中。根据这些人的说法,这被认为是最好的做法。

以下是官方定义:

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

有关如何使用AccountManager的详细指南:

  • Udi Cohen教程
  • Pilanites博客
  • 谷歌IO演示

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

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

byte[] cipherText = crypto.encrypt(plainText);
byte[] plainText = crypto.decrypt(cipherText);
冯宏恺
2023-03-14

将它们存储为共享首选项。默认情况下,它们是私有的,其他应用程序无法访问它们。在根设备上,如果用户明确允许访问试图读取它们的某个应用程序,该应用程序可能能够使用它们,但您无法对此进行保护。至于加密,您必须要求用户每次都输入解密密码短语(因此无法达到缓存凭据的目的),或者将密钥保存到文件中,您也会遇到同样的问题。

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

  • 第三方应用程序不需要知道密码,用户可以确保他们只将其发送到原始网站(Facebook,Twitter,Gmail等)
  • 即使有人偷了一个令牌,他们也看不到密码(用户也可能在其他网站上使用)
  • 代币一般有一个生命周期,在一定时间后过期
  • 如果您怀疑令牌已被泄露,则可以撤销令牌
 类似资料:
  • 我正在使用Xamarin android编写一个银行支付应用程序,该应用程序存储用户卡信息。我正在寻找一种安全可靠的存储数据的方法。我唯一发现的是下面的链接,该链接存储的帐户信息对我来说是无用的: https://developer.xamarin.com/recipes/cross-platform/xamarin-forms/general/store-credentials/

  • 在一个应用程序中,我使用Android密钥库。我已经为整个密钥库和每个密码条目设置了密码。因为这些密码是字符串,所以它们存储在代码的字符串成员中。 显然,如果我想发布应用程序,这是不安全的,因为潜在的攻击者可以反编译apk并获取密码,因为它是硬编码在应用程序中的。 我的问题是: 在上面的场景中:攻击者是否能够读取我的密钥库文件,或者(在无根手机上)该文件是否只能由我的应用程序访问,因此仅密码是不够

  • 问题内容: 我想知道如何在Android中安全存储 加密密钥 吗?保护加密和秘密密钥的最佳方案是什么? 问题答案: 根据您的评论,您需要使用适用于当前Android版本和旧Android版本的本地密钥对数据进行加密 Android Keystore 旨在生成和保护您的密钥。但是它不适用于18级以下的API级别,并且在API 23级之前有一些限制。 您将需要一个随机对称加密密钥,例如AES。AES密

  • 我有一个Android应用程序,用户必须登录才能使用它,当一个请求(在PHP中)需要一个令牌时,问题是,我需要将令牌保存在Android的共享首选项中,我知道有办法加密它,但是如果有人会打开应用程序,看到源代码,他们会知道它是如何加密的。 如何安全保存令牌? 提前感谢。

  • 基于这篇文章和这个问题,刷新令牌应该是长寿命的,访问令牌应该是短寿命的。我将存储我的刷新令牌超过或等于60天,我的访问令牌20分钟或更多/更少,但永远不会超过一个小时。 我在理解这些令牌的使用时的主要难点是两个令牌的存储方法。我明白,我应该将刷新令牌存储为,使其无法通过脚本访问(XSS攻击),并将访问令牌存储在本地,或,以便在API调用中作为密钥使用。这样做是正确的方法吗?我是否应该按照本文中的建

  • 问题内容: 我有一个Java属性对象,其中包含Web服务的身份验证信息。我需要对这些数据进行加密,但是我不知道该将加密密钥存储在何处才能保持安全。 关于加密和以安全方式检索数据的最佳实践是什么? 使用密钥库有什么好处吗? 问题答案: 您的问题很普遍。在Linux中,用户密码存储在纯文本文件中。尽管只存储了密码哈希,但是如果攻击者可以访问该文件,则使用脱机词典攻击可以很快发现一些密码。在这种情况下,