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

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


将它们存储为共享首选项。 这些默认情况下是私人的,其他应用程序无法访问它们。 在根植设备上,如果用户明确允许访问正在尝试阅读它们的某个应用程序,该应用程序可能可以使用它们,但无法防止这种情况发生。 至于加密,您必须要求用户每次都输入解密密码(这样会破坏缓存凭证的用途),或者将密钥保存到文件中,并且您也会遇到同样的问题。

存储令牌的好处不在于实际的用户名密码:

  • 第三方应用程序不需要知道密码,用户可以确保只将它发送到原始网站(Facebook,Twitter,Gmail等)
  • 即使有人盗取了令牌,也无法查看密码(用户也可能在其他网站上使用该密码)
  • 令牌通常具有一定的寿命,并在一段时间后过期
  • 如果您怀疑他们已被入侵,可以撤销令牌

  • 您可以将它们存储在AccountManager中。 根据这些家伙,这被认为是最佳实践。

    官方定义如下:

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

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

  • Udi Cohen教程
  • Pilanites博客
  • Google IO演示文稿
  • 但是,AccountManager最终只会将您的令牌存储为纯文本。 因此,我建议在将它们存储在AccountManager中之前先对其进行加密。 您可以使用AESCrypt或AESCrypto等各种加密库

    另一种选择是使用隐藏库。 对于Facebook来说这已经足够安全,并且比AccountManager更容易使用。 这是使用Conceal保存秘密文件的代码片段。

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

  • 从您的Android Studio项目窗格中,选择“项目文件”,然后在项目的根目录中创建一个名为“keystore.properties”的新文件。
  • 在这里输入图像描述

  • 打开“keystore.properties”文件并将Access Token和Secret保存在文件中。
  • 在这里输入图像描述

  • 现在加载读取应用程序模块的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?

    下一篇: PHP: Remember Me and security?