Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Android中安全地存储访问令牌和密码?_Android_Security_Oauth_Preferences_Token - Fatal编程技术网

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

如何在Android中安全地存储访问令牌和密码?,android,security,oauth,preferences,token,Android,Security,Oauth,Preferences,Token,我将使用oAuth从google获取邮件和联系人。我不想每次都要求用户登录以获取访问令牌和密码。据我所知,我需要将它们与应用程序一起存储在数据库或SharedReferences中。但是我有点担心安全问题。我了解到,您可以加密和解密令牌,但攻击者只需反编译您的apk和类并获取加密密钥就很容易了。 在Android中安全存储这些令牌的最佳方法是什么?将它们存储为。默认情况下,它们是私有的,其他应用程序无法访问它们。在根设备上,如果用户明确允许访问试图读取它们的某个应用程序,则该应用程序可能能够使用

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

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

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

  • 第三方应用不需要知道密码,用户可以确保只将密码发送到原始站点(Facebook、Twitter、Gmail等)
  • 即使有人偷了令牌,他们也看不到密码(用户也可能在其他网站上使用密码)
  • 令牌通常有一个生存期,并在一段时间后过期
  • 如果您怀疑代币已被泄露,则可以撤销代币
您可以将它们存储在中。这些人认为这是最好的做法

以下是官方定义:

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

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

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

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

byte[] cipherText = crypto.encrypt(plainText);
byte[] plainText = crypto.decrypt(cipherText);
  • 从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进行反编译,当您从外部文件加载您的访问令牌和密码时,他们也永远不会获得这些令牌和密码。

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


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

    如何存储消费者密钥和机密(硬保护它们不安全)?我需要他们请求accesstoken和secret。。其他使用oauth的现有应用程序是如何做到这一点的?嗯,最后使用oauth,您需要为我处理更多的安全问题。。。。我需要安全地保存消费者令牌/机密以及accesstoken和secret。。。。最后,仅仅存储用户的用户名/密码加密不是更简单吗?。。。最后,后者不是更好吗?我还是看不出oauth有多好…你能告诉我…哪个文件存储了访问令牌??我是android新手,我试过运行sample Plus应用程序。但是我在任何地方都找不到这个[GoogleAuthUtil.getToken()方法。]谢谢回复!但我如何知道我的消费者密钥是否已被泄露?哈哈,这很难说。。好的,关于存储访问令牌和密码,好的,我将它们保存在SharedReferences中并对它们进行加密,但是消费者密钥和密码呢?我无法将它们存储在SharedReference中(首先,我需要在代码中显式地编写使用者密钥和密码以将其保存在SharedReference中)。。我不知道你是否理解我的意思。你必须以一种(有点)模糊的方式将它们放入应用程序中,以避免它们在反编译后立即可见,或者使用你自己的具有密钥和机密的身份验证代理Web应用程序。将它们放到应用程序中显然更容易,如果认为有人试图破解你的应用程序的风险足够低,那么就采用这种方法。顺便说一句,以上几点是关于用户密码的。如果你发现你的用户密钥/密码被泄露,你也可以撤销这些(当然,这会破坏你的应用程序)。@NikolayElenkov:你写道“至于加密,你必须要求用户每次输入解密密码(第