这一篇是整理 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加密存储方法相关推荐

  1. android SharedPreferences数据存储

    android  SharedPreferences数据存储 很多时候我们开发的软件需要向用户提供软件参数设置功能,例如我们常用的QQ,用户可以设置是否允许陌生人添加自己为好友.对于软件配置参数的保存 ...

  2. android sharedpreferences加密,(译)使用AndroidX安全库加密SharedPreferences

    本文译自Encrypting Shared Preferences with the AndroidX Security Library,介绍了AndroidX安全库中EncryptedSharedP ...

  3. android 文件加密解决方法,一种Android平台的文件快速加密以及解密方法与流程

    本发明属于数据安全领域,具体涉及一种Android平台的文件快速加密以及解密方法. 背景技术: 目前移动办公系统极大地提升了企.事业单位的工作效率,而带装有办公应用的智能设备中会存储一些较高机密性的文 ...

  4. Xamarin.Android SharedPreferences的使用方法

    SharedPreferences的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息.其存储位置在/data/data/<包名>/shared_pref ...

  5. android 文件加密解决方法,如何在Android中加密和解密文件?

    我有类似的问题,加密/解密我提出了这个解决方案: public static byte[] generateKey(String password) throws Exception { byte[] ...

  6. Android Hawk的源码解析,一款基于SharedPreferences的存储框架

    转载请标注:http://blog.csdn.net/friendlychen/article/details/76218033 一.概念 SharedPreferences的使用大家应该非常熟悉啦. ...

  7. android: SharedPreferences存储

    不同于文件的存储方式,SharedPreferences 是使用键值对的方式来存储数据的.也就是 说当保存一条数据的时候,需要给这条数据提供一个对应的键,这样在读取数据的时候就可 以通过这个键把相应的 ...

  8. android SharedPreferences 存储对象

    原文地址为: android SharedPreferences 存储对象 我们知道SharedPreferences只能保存简单类型的数据,例如,String.int等. 如果想用SharedPre ...

  9. Android手机数据读写方法(内部存储、SD卡,网络加载,包内文件读取)

        本次实例以文本和图片为例,展示了Android手机内部存储的读写方法.SD卡的读写方法,包内文件的读取,以及网络文本及图片的加载与下载.     项目文件在此:文档下载传送门 从网络加载图片或 ...

最新文章

  1. php+imagick详解,PHP中imagick函数的中文解释_php技巧
  2. 【SAP】自定义权限对象
  3. 【Elasticsearch】ELASTICSEARCH集群节点的扩容(移除与添加)
  4. 计算机语言系统不支持,win7电脑安装IE8出现“此安装不支持您的操作系统的当前语言”怎么办...
  5. mysql手机客户端_图解MySQL索引--B-Tree(B+Tree)
  6. WSS3.0自带的问题跟踪工作流(Issue Tracking)的说明
  7. Dependency, Association, Aggregation Composition的四种区别
  8. 拓端tecdat|R语言时变向量自回归(TV-VAR)模型分析时间序列和可视化
  9. 所有快捷方式失效的解决方法
  10. Cookie简明小册
  11. windows 10 微软拼音输入法设置
  12. 计算机应该玩什么游戏,电脑玩游戏主要靠什么配置
  13. 老王的JAVA基础课:第6课 JAVA基本数据类型
  14. mysql修改 mysql.sock路径导致登录时异常
  15. maven项目编译中文乱码和myeclipse中文乱码和电脑乱码?
  16. 【vue】vue中axios的使用及vue生命周期详解_07
  17. Android自定义半圆进度条 半圆渐变色进度条带指示 半圆开口大小可自由修改
  18. 宝塔php memory_limit,优化宝塔面板提高网站运行速度教程
  19. android TV 焦点选中放大效果
  20. 正多边形的滚动与旋轮线下的面积

热门文章

  1. tcm工具 软件测试,如何使用 TCM? TCM 测试总结报告
  2. 如何创建应用程序清单文件 App.Manifest,如何创建不带清单的应用程序
  3. win10 下载docker慢
  4. 创建3d人物模型并导入unity实现动画
  5. 第78届中国教育装备展示会即将在重庆开幕,亮点来了!
  6. Embarcadero推出RAD Studio 10.3.1
  7. java heap space解决方法
  8. 一名黑客小鲜肉的“平凡之路”
  9. 迅睿cms免登陆新闻发布接口
  10. PCI网卡上扩展ROM编程 3.基址寄存器