如何在Android中安全地存储访问令牌和秘密?
我将使用oAuth从谷歌获取邮件和联系人。 我不想每次都要求用户登录以获取访问令牌和秘密。 根据我的理解,我需要将它们与我的应用程序一起存储在数据库或SharedPreferences
。 但我有点担心安全问题。 我读过你可以对令牌进行加密和解密,但攻击者很容易只是反编译你的apk和类并获得加密密钥。
在Android中安全存储这些令牌的最佳方法是什么?
将它们存储为共享首选项。 这些默认情况下是私人的,其他应用程序无法访问它们。 在根植设备上,如果用户明确允许访问正在尝试阅读它们的某个应用程序,该应用程序可能可以使用它们,但无法防止这种情况发生。 至于加密,您必须要求用户每次都输入解密密码(这样会破坏缓存凭证的用途),或者将密钥保存到文件中,并且您也会遇到同样的问题。
存储令牌的好处不在于实际的用户名密码:
您可以将它们存储在AccountManager中。 根据这些家伙,这被认为是最佳实践。
官方定义如下:
该课程提供对用户在线帐户的集中注册表的访问。 用户每个帐户输入一次凭据(用户名和密码),通过“单击”批准授予应用程序访问在线资源的权限。
有关如何使用AccountManager的详细指南:
但是,AccountManager最终只会将您的令牌存储为纯文本。 因此,我建议在将它们存储在AccountManager中之前先对其进行加密。 您可以使用AESCrypt或AESCrypto等各种加密库
另一种选择是使用隐藏库。 对于Facebook来说这已经足够安全,并且比AccountManager更容易使用。 这是使用Conceal保存秘密文件的代码片段。
byte[] cipherText = crypto.encrypt(plainText);
byte[] plainText = crypto.decrypt(cipherText);
现在加载读取应用程序模块的build.gradle文件中的访问令牌和秘密。 然后,您需要为Access Token和Secret定义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,他们也永远不会得到你的访问令牌和秘密,因为你从外部文件加载它们。
链接地址: http://www.djcxy.com/p/21889.html上一篇: How to securely store access token and secret in Android?