使用Android Jetpack提供的Security库对SharedPreferences数据加密

2,003 阅读2分钟

在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中的数据进行加密,也可以对文件进行加密操作。使用起来也很简单,感兴趣的小伙伴可以查看下官方文档(文末给出链接)。

参考文档:

Google官方文档更安全地处理数据

Google官方文档在其他各 Android 版本中更安全地处理数据