介绍

封装了SharePreference插入AES加密后的数据的功能,减少了明文存储造成用户信息泄露的风险

使用方式

  • Applicaton初始化
 public class MyApplication extends Application {private static Context appContext;@Overridepublic void onCreate() {super.onCreate();setAppContext(getApplicationContext());//初始化AES工具类,并设置AES密码AESUtils.init("ASDFSDokju98kSsdfDF");//默认SharePreference使用USERINFO标签数据 切换到其他文件通过 setTag()方法SharePreferencesUtils.init("USERINFO");}public static Context getAppContext() {if (appContext == null)appContext = getAppContext();return appContext;}public static void setAppContext(Context appContext) {MyApplication.appContext = appContext;}
}
  • 写入加密数据到SharePreference
SharePreferencesUtils.setTag("USERINFO");SharePreferencesUtils.putString("username", "迪丽热巴");SharePreferencesUtils.putString("password", "abc123");SharePreferencesUtils.putString("phone", "18567345345");
  • 读取SharePreference的加密数据
 SharePreferencesUtils.getString("username");SharePreferencesUtils.getString("password");SharePreferencesUtils.getString("phone");

两个工具类如下

AESUtils类

package com.hujing.kabao.utils;import android.support.annotation.NonNull;import java.io.UnsupportedEncodingException;import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;public class AESUtils {private static String aes_key;private AESUtils() {}/*** 静态内部类实现单例模式*/private static class AESUtilsHelp {private static final AESUtils instance = new AESUtils();}public static AESUtils init(@NonNull String key) {aes_key = key;return AESUtilsHelp.instance;}//    private static final String CipherMode = "AES/ECB/PKCS5Padding";使用ECB加密,不需要设置IV,但是不安全private static final String CipherMode = "AES/CFB/NoPadding";//使用CFB加密,需要设置IV// /** 创建密钥 **/private static SecretKeySpec createKey(String password) {byte[] data = null;if (password == null) {password = "";}StringBuilder sb = new StringBuilder(32);sb.append(password);while (sb.length() < 32) {sb.append("0");}if (sb.length() > 32) {sb.setLength(32);}try {data = sb.toString().getBytes("UTF-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}return new SecretKeySpec(data, "AES");}// /** 加密字节数据 **/private static byte[] encrypt(byte[] content, String password) {try {SecretKeySpec key = createKey(password);System.out.println(key);Cipher cipher = Cipher.getInstance(CipherMode);cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(new byte[cipher.getBlockSize()]));return cipher.doFinal(content);} catch (Exception e) {e.printStackTrace();}return null;}// /** 加密(结果为16进制字符串) **/public static String encrypt(String content) {String password = aes_key;byte[] data = null;try {data = content.getBytes("UTF-8");} catch (Exception e) {e.printStackTrace();}data = encrypt(data, password);String result = byte2hex(data);return result;}// /** 解密字节数组 **/private static byte[] decrypt(byte[] content, String password) {try {SecretKeySpec key = createKey(password);Cipher cipher = Cipher.getInstance(CipherMode);cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(new byte[cipher.getBlockSize()]));return cipher.doFinal(content);} catch (Exception e) {e.printStackTrace();}return null;}// /** 解密16进制的字符串为字符串 **/public static String decrypt(String content) {String password = aes_key;byte[] data = null;try {data = hex2byte(content);} catch (Exception e) {e.printStackTrace();}data = decrypt(data, password);if (data == null)return null;String result = null;try {result = new String(data, "UTF-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}return result;}// /** 字节数组转成16进制字符串 **/private static String byte2hex(byte[] b) { // 一个字节的数,StringBuilder sb = new StringBuilder(b.length * 2);String tmp = "";for (byte aB : b) {// 整数转成十六进制表示tmp = (Integer.toHexString(aB & 0XFF));if (tmp.length() == 1) {sb.append("0");}sb.append(tmp);}return sb.toString().toUpperCase(); // 转成大写}// /** 将hex字符串转换成字节数组 **/private static byte[] hex2byte(String inputString) {if (inputString == null || inputString.length() < 2) {return new byte[0];}inputString = inputString.toLowerCase();int l = inputString.length() / 2;byte[] result = new byte[l];for (int i = 0; i < l; ++i) {String tmp = inputString.substring(2 * i, 2 * i + 2);result[i] = (byte) (Integer.parseInt(tmp, 16) & 0xFF);}return result;}
}

SharePreferencesUtils类
(只写了String的插入于读取,其他数据类型自行添加)

package com.hujing.kabao.utils;import android.annotation.SuppressLint;
import android.content.Context;
import android.content.SharedPreferences;
import android.support.annotation.NonNull;
import android.util.Log;import com.hujing.kabao.MyApplication;public class SharePreferencesUtils {private static Context context;private static SharedPreferences preferences;private static SharedPreferences.Editor editor;private SharePreferencesUtils() {}private static class SharePerferencesUtilsHelp {private static final SharePreferencesUtils instance = new SharePreferencesUtils();}@SuppressLint("CommitPrefEdits")public static SharePreferencesUtils init(@NonNull String preferenceName) {context = MyApplication.getAppContext();preferences = context.getSharedPreferences(preferenceName, Context.MODE_PRIVATE);editor = preferences.edit();return SharePerferencesUtilsHelp.instance;}@SuppressLint("CommitPrefEdits")public static void setTag(String tag) {preferences = context.getSharedPreferences(tag, Context.MODE_PRIVATE);editor = preferences.edit();}public static void putString(String key, String value) {String aesValue = AESUtils.encrypt(value);Log.i("test", "插入的AES数据:" + aesValue);editor.putString(key, aesValue);editor.commit();}public static String getString(String key) {String aesValue = preferences.getString(key, null);if (aesValue == null)return null;return AESUtils.decrypt(aesValue);}
}

水平有限,不足之处,望指正,方能进步。

转载于:https://www.cnblogs.com/chenyangqi/articles/9317578.html

AES加密SharePreference数据相关推荐

  1. jquery java aes_[代码全屏查看]-java、js之间使用AES加密通信数据

    [1].[代码] java AES加密解密辅助类 package com.zoki.security; import ch.qos.logback.classic.Logger; import jav ...

  2. Android加密工具类,Android AES加密工具类分享

    1.AES加密工具类 java不支持PKCS7Padding,只支持PKCS5Padding.我们知道加密算法由算法+模式+填充组成,下一篇介绍iOS和Android通用的AES加密,本篇文章使用PK ...

  3. AES加密有什么用,AES加密算法安全性如何

    在计算机领域中,信息数据传输的安全一直非常受到关注.在对称加密中,AES加密算法作为DES算法和MD5算法的替代产品,10轮循环到目前为止还没有被破解.那么,AES加密有什么用,AES加密算法安全性如 ...

  4. 什么标准规定了aes加密_高级加密标准(AES)分析

    原标题:高级加密标准(AES)分析 0×00 前言 在密码学中,block(分组)密码的工作模式被广泛使用,使用同一个分组密码密钥对很多称之为块的数据加密,在优于很多诸如RSA.ECC密码的性能的情况 ...

  5. java实现数据AES加密

    1.AES加密 AES是美国国家标准技术研究所NIST旨在取代DES的21世纪的加密标准. AES是基于数据块的加密方式,也就是说,每次处理的数据是一块(16字节),当数据不是16字节的倍数时填充,这 ...

  6. 数据AES加密安全传输之前端JS加密解密

    AES(Advanced Encryption Standard)是一种对称加密方式,旨在取代DES成为广泛使用的标准.我在前端实现关键数据报文加密时采用了该加密方式. 我使用的AES加密架包是cry ...

  7. 使用Python3进行AES加密和解密 输入的数据

    高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DES, ...

  8. cryptojs aes加密每次结果不同_Javascript加密算法标准库,支持Nodejs+浏览器——crypto-js...

    介绍 crypto-js是一个前端Javascript标准加密算法库,CryptoJS (crypto.js) 为 JavaScript 提供了各种各样的加密算法.有时候项目涉及到的敏感数据比较多,为 ...

  9. aes加密内容不定长_浅谈加密技术

    1.加密算法术语 假设我们将ABCD中的每个字母替换为其后的第二个字母,例如A替换为C,最终ABCD替换为CDEF. 明    文:ABCD 加密算法:字母替换 密    钥:每个字母替换为其后的第二 ...

  10. Libgcrypt实现AES加密

    Libgcrypt是著名的开源加密软件GnuPG的底层库,是一个非常成熟的加密算法库,支持多种对称和非对称加密算法.现在自己随便造轮子地写一个加密算法程序显然是非常不安全的,虽然OpenSSL出现了H ...

最新文章

  1. 负数赋值给无符号数的陷阱【转】
  2. (转)Android SharedPreferences的使用
  3. cocos2dx 引入 libpomelo库
  4. .net 默认时间格式不正确
  5. 《Google官方SEO指南》十一:以恰当的方式推广你的网站
  6. winre drv分区干嘛用的_都2020年了,还在给硬盘分区?看完你就知道有没有必要了...
  7. 用户ID生成唯一邀请码的几种方法
  8. [树状数组][二分] 洛谷 P2161 会场预约
  9. 谈谈我在自然语言处理进阶上的一些个人拙见
  10. 奔跑中的2015 — 提剑的少年
  11. Zabbix 监控 MongoDB
  12. Struts框架面试题
  13. 股票分析软件编程开发日记与总结,自动交易软件开发
  14. 计算机自带游戏打不开,win10系统自带游戏打不开的还原步骤
  15. 腾讯云服务器价格表在哪里查看?
  16. [Leetcode] 158. Read N Characters Given Read4 II - Call multiple times 解题报告
  17. 经纬度的多种格式和转换方式
  18. PDF压缩有哪些方法?用迅读PDF大师,压缩清晰无损
  19. proc*c/c++简介
  20. 《新编计算机科学概论》一第0章 绪  论

热门文章

  1. DropDownList 递归绑定分子公司信息
  2. iOS-深复制(mutableCopy)与浅复制(copy)
  3. ASP.NET MVC+EF框架+EasyUI实现权限管理系列
  4. display和float使用上的区别(1)-----多栏布局的实现
  5. 在服务器上log4net没写日志
  6. 基于Protues的Arduino学习笔记01-Arduino UNO实验板设计
  7. 监控数据库锁阻塞_机器连接数_警报日志的shell脚本 分享
  8. HDU-2161 Primes
  9. 面试必备!Kafka 怎么顺序消费?
  10. 面试官:什么是对象池?有什么用?别说你还不会!