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

2019-05-13 13:07发布

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

Answer 1:

并将其作为共享偏好。 这些都是默认为私有的,和其他应用程序不能访问它们。 在一个根深蒂固的设备,如果用户明确允许访问某些应用程序,试图读取它们,应用程序可能能够使用它们,但你不能防止这一点。 至于加密,你必须要么要求用户每次(从而击败缓存凭据的目的),进入解密密码,或将密钥保存到一个文件,你会得到同样的问题。

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

  • 第三方应用程序不需要知道密码,用户可以肯定的是,他们只是将其发送到原始网站(Facebook,微博,Gmail等)
  • 即使有人窃取道理,不要看到该密码(用户可能使用的其他网站也哪个)
  • 令牌通常有一生的时间和一定的时间后过期
  • 令牌可以,如果你怀疑自己受到了侵害被撤销


Answer 2:

你可以将它们存储在的AccountManager 。 它是根据这些人认为是最佳做法。

下面是官方的定义:

这个类提供了访问用户的在线账户的集中注册。 用户输入凭据(用户名和密码),每个帐户一次,授予应用程序访问网络资源,“一键式”审批。

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

  • 乌迪·科恩教程
  • Pilanites博客
  • 谷歌IO演示

然而,最终的AccountManager只存储您的令牌作为一个纯文本。 所以,我建议将它们存储在之前的AccountManager加密你的秘密。 您可以使用各种加密库像AESCrypt或AESCrypto

另一种选择是使用隐藏式库 。 这对于Facebook是足够安全和​​更容易使用比的AccountManager使用。 这里有一个代码片段保存使用隐瞒的秘密文件。

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


Answer 3:

  1. 从Android Studio的项目窗格中,选择“项目文件”,创造在项目的根目录下一个名为“keystore.properties”的新文件。

  1. 打开“keystore.properties”文件并保存您的访问令牌和机密的文件中。

  1. 现在加载你的应用程序模块的build.gradle文件的读取访问令牌和秘密。 然后,你需要定义BuildConfig变量的访问令牌和秘密,让你可以,你可以直接在代码中访问它们。 你的build.gradle可能看起来像以下:

     ... ... ... android { compileSdkVersion 26 // Load values from keystore.properties file def keystorePropertiesFile = rootProject.file("keystore.properties") def keystoreProperties = new Properties() keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) defaultConfig { applicationId "com.yourdomain.appname" minSdkVersion 16 targetSdkVersion 26 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" // Create BuildConfig variables buildConfigField "String", "ACCESS_TOKEN", keystoreProperties["ACCESS_TOKEN"] buildConfigField "String", "SECRET", keystoreProperties["SECRET"] } } 
  2. 您可以使用您的访问令牌和秘密在你的代码是这样的:

     String accessToken = BuildConfig.ACCESS_TOKEN; String secret = BuildConfig.SECRET; 

这样,你不需要存储访问令牌和秘密在你的项目中纯文本。 所以,即使有人反编译您的APK,他们将永远不会得到你的访问令牌和秘密,你是从外部文件加载它们。



Answer 4:

SharedPreferences 是不是一个安全的位置本身。 在一个植根设备,我们可以轻松地读取和修改所有的应用程序SharedPrefereces XML的。 所以令牌到期应相对频繁。 但即使令牌到期每隔一小时,新的令牌,仍然可以从SharedPreferences被盗。 Android的密钥库应该用于长期存储和将被用于为了将它们存储在例如SharedPreferences或我们的数据库加密令牌密钥的检索。 这些密钥没有存储应用程序的过程中,所以它们更难被破坏。

所以,比地方更相关的是,他们如何能确保自身例如,使用加密签名的短版活JWTs,采用Android密钥库加密它们与安全协议发送它们



Answer 5:

那么你可以确保由以下两个选项,你的访问令牌。

  1. 使用保存您的访问令牌到Android的密钥库不会被逆转。
  2. 使用NDK函数的一些计算是保存令牌和NDK使用C ++代码,这是非常难以逆转


文章来源: How to securely store access token and secret in Android?