如何在Android中安全地存储访问令牌和密码?
我将使用oAuth从google获取邮件和联系人。我不想每次都要求用户登录以获取访问令牌和密码。据我所知,我需要将它们与应用程序一起存储在数据库或如何在Android中安全地存储访问令牌和密码?,android,security,oauth,preferences,token,Android,Security,Oauth,Preferences,Token,我将使用oAuth从google获取邮件和联系人。我不想每次都要求用户登录以获取访问令牌和密码。据我所知,我需要将它们与应用程序一起存储在数据库或SharedReferences中。但是我有点担心安全问题。我了解到,您可以加密和解密令牌,但攻击者只需反编译您的apk和类并获取加密密钥就很容易了。 在Android中安全存储这些令牌的最佳方法是什么?将它们存储为。默认情况下,它们是私有的,其他应用程序无法访问它们。在根设备上,如果用户明确允许访问试图读取它们的某个应用程序,则该应用程序可能能够使用
SharedReferences
中。但是我有点担心安全问题。我了解到,您可以加密和解密令牌,但攻击者只需反编译您的apk和类并获取加密密钥就很容易了。在Android中安全存储这些令牌的最佳方法是什么?将它们存储为。默认情况下,它们是私有的,其他应用程序无法访问它们。在根设备上,如果用户明确允许访问试图读取它们的某个应用程序,则该应用程序可能能够使用它们,但您无法对此进行保护。至于加密,您必须要求用户每次都输入解密密码短语(因此无法达到缓存凭据的目的),或者将密钥保存到文件中,您也会遇到同样的问题 存储令牌而不是实际的用户名密码有一些好处:
- 第三方应用不需要知道密码,用户可以确保只将密码发送到原始站点(Facebook、Twitter、Gmail等)
- 即使有人偷了令牌,他们也看不到密码(用户也可能在其他网站上使用密码)
- 令牌通常有一个生存期,并在一段时间后过期
- 如果您怀疑代币已被泄露,则可以撤销代币
byte[] cipherText = crypto.encrypt(plainText);
byte[] plainText = crypto.decrypt(cipherText);
... ... ...
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;
因此,比一个地方更重要的是它们自身的安全性,例如,使用加密签名的短期JWT,使用Android密钥库对它们进行加密,并使用安全协议发送它们如何存储消费者密钥和机密(硬保护它们不安全)?我需要他们请求accesstoken和secret。。其他使用oauth的现有应用程序是如何做到这一点的?嗯,最后使用oauth,您需要为我处理更多的安全问题。。。。我需要安全地保存消费者令牌/机密以及accesstoken和secret。。。。最后,仅仅存储用户的用户名/密码加密不是更简单吗?。。。最后,后者不是更好吗?我还是看不出oauth有多好…你能告诉我…哪个文件存储了访问令牌??我是android新手,我试过运行sample Plus应用程序。但是我在任何地方都找不到这个[GoogleAuthUtil.getToken()方法。]谢谢回复!但我如何知道我的消费者密钥是否已被泄露?哈哈,这很难说。。好的,关于存储访问令牌和密码,好的,我将它们保存在SharedReferences中并对它们进行加密,但是消费者密钥和密码呢?我无法将它们存储在SharedReference中(首先,我需要在代码中显式地编写使用者密钥和密码以将其保存在SharedReference中)。。我不知道你是否理解我的意思。你必须以一种(有点)模糊的方式将它们放入应用程序中,以避免它们在反编译后立即可见,或者使用你自己的具有密钥和机密的身份验证代理Web应用程序。将它们放到应用程序中显然更容易,如果认为有人试图破解你的应用程序的风险足够低,那么就采用这种方法。顺便说一句,以上几点是关于用户密码的。如果你发现你的用户密钥/密码被泄露,你也可以撤销这些(当然,这会破坏你的应用程序)。@NikolayElenkov:你写道“至于加密,你必须要求用户每次输入解密密码(第