Android SharedPreferences加密存储方法
这一篇是整理 Android本地数据SP加密存储的方法,也是属于APP安全范畴。主要是通过AES加密方法进行加密,对Key和Value全部加密,进一步保障数据安全
方法整理如下:
import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.text.TextUtils;import androidx.annotation.NonNull;import com.jlpay.connect.utils.AESUtils;
import com.jlpay.partner.application.PartnerApp;/*** Created by on 2020/12/04.*/public class SpUtils {//TODO 可以考虑在内存中加一个二级缓存机制,避免频繁从SP文件中读取性能低下public static Context context = PartnerApp.getContext();/*** SP加密存储,Key 和 Value 均加密* 将所有类型数据都转为 String 后加密*/private static void encryptPut(@NonNull String key, @NonNull Object value) {String valueStr = null;if (value instanceof String) {valueStr = (String) value;} else if (value instanceof Boolean) {valueStr = Boolean.toString((Boolean) value);} else if (value instanceof Integer) {valueStr = Integer.toString((Integer) value);} else if (value instanceof Float) {valueStr = Float.toString((Float) value);} else if (value instanceof Long) {valueStr = Long.toString((Long) value);}byte[] encryptKey = AESUtils.encrypt(AESUtils.AES_KEY.getBytes(), key.getBytes());String base64KeyStr = RSAUtils.byteToBase64Str(encryptKey);
// final SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);final SharedPreferences settings = context.getSharedPreferences(context.getPackageName() + "_preferences", MODE_PRIVATE);if (valueStr != null && !TextUtils.isEmpty(valueStr)) {byte[] encryptValue = AESUtils.encrypt(AESUtils.AES_KEY.getBytes(), valueStr.getBytes());String base64ValueStr = RSAUtils.byteToBase64Str(encryptValue);settings.edit().putString(base64KeyStr, base64ValueStr).apply();} else {settings.edit().putString(base64KeyStr, "").apply();}}/*** SP解密*/private static Object decryptGet(@NonNull String key, @NonNull Object defaultvalue) {String valueStr = null;
// final SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);final SharedPreferences settings = context.getSharedPreferences(context.getPackageName() + "_preferences", MODE_PRIVATE);byte[] encryptKey = AESUtils.encrypt(AESUtils.AES_KEY.getBytes(), key.getBytes());String base64KeyStr = RSAUtils.byteToBase64Str(encryptKey);if (defaultvalue instanceof String) {valueStr = (String) defaultvalue;String settingsString = settings.getString(base64KeyStr, valueStr);if (settingsString != null && !TextUtils.isEmpty(settingsString) && !settingsString.equals(valueStr)) {byte[] bytes = RSAUtils.base64StrToByte(settingsString);byte[] decryptByte = AESUtils.decrypt(AESUtils.AES_KEY.getBytes(), bytes);String decryptStr = new String(decryptByte).trim();return decryptStr;}return valueStr;} else if (defaultvalue instanceof Boolean) {valueStr = Boolean.toString((Boolean) defaultvalue);String settingsString = settings.getString(base64KeyStr, valueStr);if (settingsString != null && !TextUtils.isEmpty(settingsString) && !settingsString.equals(valueStr)) {byte[] bytes = RSAUtils.base64StrToByte(settingsString);byte[] decryptByte = AESUtils.decrypt(AESUtils.AES_KEY.getBytes(), bytes);String decryptStr = new String(decryptByte).trim();return Boolean.valueOf(decryptStr);}return (boolean) defaultvalue;} else if (defaultvalue instanceof Integer) {valueStr = Integer.toString((Integer) defaultvalue);String settingsString = settings.getString(base64KeyStr, valueStr);if (settingsString != null && !TextUtils.isEmpty(settingsString) && !settingsString.equals(valueStr)) {byte[] bytes = RSAUtils.base64StrToByte(settingsString);byte[] decryptByte = AESUtils.decrypt(AESUtils.AES_KEY.getBytes(), bytes);String decryptStr = new String(decryptByte).trim();return Integer.valueOf(decryptStr);}return (int) defaultvalue;} else if (defaultvalue instanceof Float) {valueStr = Float.toString((Float) defaultvalue);String settingsString = settings.getString(base64KeyStr, valueStr);if (settingsString != null && !TextUtils.isEmpty(settingsString) && !settingsString.equals(valueStr)) {byte[] bytes = RSAUtils.base64StrToByte(settingsString);byte[] decryptByte = AESUtils.decrypt(AESUtils.AES_KEY.getBytes(), bytes);String decryptStr = new String(decryptByte).trim();return Float.valueOf(decryptStr);}return (float) defaultvalue;} else if (defaultvalue instanceof Long) {valueStr = Long.toString((Long) defaultvalue);String settingsString = settings.getString(base64KeyStr, valueStr);if (settingsString != null && !TextUtils.isEmpty(settingsString) && !settingsString.equals(valueStr)) {byte[] bytes = RSAUtils.base64StrToByte(settingsString);byte[] decryptByte = AESUtils.decrypt(AESUtils.AES_KEY.getBytes(), bytes);String decryptStr = new String(decryptByte).trim();return Long.valueOf(decryptStr);}return (long) defaultvalue;}return null;}public static String getPrefString(String key, final String defaultValue) {
// final SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
// return settings.getString(key, defaultValue);return (String) decryptGet(key, defaultValue);}public static void setPrefString(final String key, final String value) {
// final SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
// settings.edit().putString(key, value).apply();encryptPut(key, value);}public static boolean getPrefBoolean(final String key, final boolean defaultValue) {
// final SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
// return settings.getBoolean(key, defaultValue);return (boolean) decryptGet(key, defaultValue);}public static boolean hasKey(final String key) {return PreferenceManager.getDefaultSharedPreferences(context).contains(key);}public static void setPrefBoolean(final String key, final boolean value) {
// final SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
// settings.edit().putBoolean(key, value).apply();encryptPut(key, value);}public static void setPrefInt(final String key, final int value) {
// final SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
// settings.edit().putInt(key, value).apply();encryptPut(key, value);}public static int getPrefInt(final String key, final int defaultValue) {
// final SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
// return settings.getInt(key, defaultValue);return (int) decryptGet(key, defaultValue);}public static void setPrefFloat(final String key, final float value) {
// final SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
// settings.edit().putFloat(key, value).apply();encryptPut(key, value);}public static float getPrefFloat(final String key, final float defaultValue) {
// final SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
// return settings.getFloat(key, defaultValue);return (float) decryptGet(key, defaultValue);}public static void setSettingLong(final String key, final long value) {
// final SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
// settings.edit().putLong(key, value).apply();encryptPut(key, value);}public static long getPrefLong(final String key, final long defaultValue) {
// final SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
// return settings.getLong(key, defaultValue);return (long) decryptGet(key, defaultValue);}public static void clearPreference(final SharedPreferences p) {final SharedPreferences.Editor editor = p.edit();editor.clear();editor.apply();}}
下面是导出来的 SP文件截图:这样也无法凭Key去猜测了
Android SharedPreferences加密存储方法相关推荐
- android SharedPreferences数据存储
android SharedPreferences数据存储 很多时候我们开发的软件需要向用户提供软件参数设置功能,例如我们常用的QQ,用户可以设置是否允许陌生人添加自己为好友.对于软件配置参数的保存 ...
- android sharedpreferences加密,(译)使用AndroidX安全库加密SharedPreferences
本文译自Encrypting Shared Preferences with the AndroidX Security Library,介绍了AndroidX安全库中EncryptedSharedP ...
- android 文件加密解决方法,一种Android平台的文件快速加密以及解密方法与流程
本发明属于数据安全领域,具体涉及一种Android平台的文件快速加密以及解密方法. 背景技术: 目前移动办公系统极大地提升了企.事业单位的工作效率,而带装有办公应用的智能设备中会存储一些较高机密性的文 ...
- Xamarin.Android SharedPreferences的使用方法
SharedPreferences的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息.其存储位置在/data/data/<包名>/shared_pref ...
- android 文件加密解决方法,如何在Android中加密和解密文件?
我有类似的问题,加密/解密我提出了这个解决方案: public static byte[] generateKey(String password) throws Exception { byte[] ...
- Android Hawk的源码解析,一款基于SharedPreferences的存储框架
转载请标注:http://blog.csdn.net/friendlychen/article/details/76218033 一.概念 SharedPreferences的使用大家应该非常熟悉啦. ...
- android: SharedPreferences存储
不同于文件的存储方式,SharedPreferences 是使用键值对的方式来存储数据的.也就是 说当保存一条数据的时候,需要给这条数据提供一个对应的键,这样在读取数据的时候就可 以通过这个键把相应的 ...
- android SharedPreferences 存储对象
原文地址为: android SharedPreferences 存储对象 我们知道SharedPreferences只能保存简单类型的数据,例如,String.int等. 如果想用SharedPre ...
- Android手机数据读写方法(内部存储、SD卡,网络加载,包内文件读取)
本次实例以文本和图片为例,展示了Android手机内部存储的读写方法.SD卡的读写方法,包内文件的读取,以及网络文本及图片的加载与下载. 项目文件在此:文档下载传送门 从网络加载图片或 ...
最新文章
- php+imagick详解,PHP中imagick函数的中文解释_php技巧
- 【SAP】自定义权限对象
- 【Elasticsearch】ELASTICSEARCH集群节点的扩容(移除与添加)
- 计算机语言系统不支持,win7电脑安装IE8出现“此安装不支持您的操作系统的当前语言”怎么办...
- mysql手机客户端_图解MySQL索引--B-Tree(B+Tree)
- WSS3.0自带的问题跟踪工作流(Issue Tracking)的说明
- Dependency, Association, Aggregation Composition的四种区别
- 拓端tecdat|R语言时变向量自回归(TV-VAR)模型分析时间序列和可视化
- 所有快捷方式失效的解决方法
- Cookie简明小册
- windows 10 微软拼音输入法设置
- 计算机应该玩什么游戏,电脑玩游戏主要靠什么配置
- 老王的JAVA基础课:第6课 JAVA基本数据类型
- mysql修改 mysql.sock路径导致登录时异常
- maven项目编译中文乱码和myeclipse中文乱码和电脑乱码?
- 【vue】vue中axios的使用及vue生命周期详解_07
- Android自定义半圆进度条 半圆渐变色进度条带指示 半圆开口大小可自由修改
- 宝塔php memory_limit,优化宝塔面板提高网站运行速度教程
- android TV 焦点选中放大效果
- 正多边形的滚动与旋轮线下的面积