在Android开发中,我们经常使用SharedPreferences存储一些用户数据。SharedPreferences使用起来很方便,但是使用SharedPreferences存储的数据是以明文形式保存在data/data/App包名/shared_prefs目录下。要是直接使用SharedPreferences存储一些用户敏感数据就会有安全上面的问题,庆幸的是Google官方提供了Security库解决这个问题。
注意:Security 库版本 1.0.0 仅适用于运行 Android 6.0(API 级别 23)和更高版本的设备。新版本的库则支持其他 Android 版本。
截止目前,使用最新的 Security 库版本 1.1.0库适用于搭载 Android 5.0(API 级别 21)及更高版本的设备。
使用
1. 配置对应module的build.gradle文件
implementation "androidx.security:security-crypto:1.1.0-alpha02"
配置完成之后,同步下Gradle。在同步的时候由于网络原因经常失败,可以使用阿里镜像进行同步,在项目的build.gradle文件下配置:
allprojects {
repositories {
maven { url 'https://maven.aliyun.com/repository/google' }
...
}
}
然后再同步下gradle应该就可以了。这里随便列下阿里的其他几个镜像,以备需要的时候查询:
maven { url 'http://maven.aliyun.com/nexus/content/groups/public' }
maven { url 'https://maven.aliyun.com/repository/google' }
maven { url 'https://maven.aliyun.com/repository/jcenter' }
2.使用EncryptedSharedPreferences加密数据
同步完成之后,项目下就会多了个加密库的依赖,如图:
对SharedPreferences进行加密需要使用EncryptedSharedPreferences。EncryptedSharedPreferences的说明和继承关系如下:
/**
* An implementation of {@link SharedPreferences} that encrypts keys and values.
*
* <pre>
* String masterKeyAlias = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC);
*
* SharedPreferences sharedPreferences = EncryptedSharedPreferences.create(
* "secret_shared_prefs",
* masterKeyAlias,
* context,
* EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
* EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
* );
*
* // use the shared preferences and editor as you normally would
* SharedPreferences.Editor editor = sharedPreferences.edit();
* </pre>
*/
public final class EncryptedSharedPreferences implements SharedPreferences {
...
final SharedPreferences mSharedPreferences;//这个是真正操作数据的SharedPreferences对象
...
注释说的很明白,也给出了使用的示例。EncryptedSharedPreferences实现了SharedPreferences并对keys和values进行了加密,在完成相关配置之后,使用起来和SharedPreferences一样。EncryptedSharedPreferences内部持有一个真正用来操作数据的SharedPreferences实例mSharedPreferences,EncryptedSharedPreferences在进行读写时对数据进行加解密后使用mSharedPreferences进行真正的持久化。
使用示例:
Context context = getApplicationContext();
MasterKey masterKey = new MasterKey.Builder(context)
.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
.build();
EncryptedSharedPreferences sharedPreferences = EncryptedSharedPreferences
.create(
context,
FILE_NAME,
masterKey,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
);
SharedPreferences.Editor sharedPrefsEditor = sharedPreferences.edit();
后续再进行读写数据时,使用sharedPreferences对象进行即可,使用方式和我们之前使用SharedPreferences完全一样。
Android官方提供的Security不仅可以对SharedPreferences中的数据进行加密,也可以对文件进行加密操作。使用起来也很简单,感兴趣的小伙伴可以查看下官方文档(文末给出链接)。
参考文档: