我将使用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:
- 从Android Studio的项目窗格中,选择“项目文件”,创造在项目的根目录下一个名为“keystore.properties”的新文件。
- 打开“keystore.properties”文件并保存您的访问令牌和机密的文件中。
现在加载你的应用程序模块的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"] } }
您可以使用您的访问令牌和秘密在你的代码是这样的:
String accessToken = BuildConfig.ACCESS_TOKEN; String secret = BuildConfig.SECRET;
这样,你不需要存储访问令牌和秘密在你的项目中纯文本。 所以,即使有人反编译您的APK,他们将永远不会得到你的访问令牌和秘密,你是从外部文件加载它们。
Answer 4:
SharedPreferences 是不是一个安全的位置本身。 在一个植根设备,我们可以轻松地读取和修改所有的应用程序SharedPrefereces XML的。 所以令牌到期应相对频繁。 但即使令牌到期每隔一小时,新的令牌,仍然可以从SharedPreferences被盗。 Android的密钥库应该用于长期存储和将被用于为了将它们存储在例如SharedPreferences或我们的数据库加密令牌密钥的检索。 这些密钥没有存储应用程序的过程中,所以它们更难被破坏。
所以,比地方更相关的是,他们如何能确保自身例如,使用加密签名的短版活JWTs,采用Android密钥库加密它们与安全协议发送它们
Answer 5:
那么你可以确保由以下两个选项,你的访问令牌。
- 使用保存您的访问令牌到Android的密钥库不会被逆转。
- 使用NDK函数的一些计算是保存令牌和NDK使用C ++代码,这是非常难以逆转