在我们日常开发中,对数据加密是必不可少的一项设计,主要是为了数据能在网络上安全的进行传输。
如果不对数据加密则容易被抓包工具抓取和破解,如果加密过于简单,也很容易被逆向破解。
所以,为确保数据传输和数据存储的安全,可通过特定的算法,将数据明文进行摘要加密成复杂的密文后才进行传输。
目前主流加密手段大致可分为单向加密和双向加密,下面使用的方式是双向加密可逆算法Triple DES(俗称:3DES)和Base64编码混合使用。
DES加密介绍:
DES是一种对称加密算法,所谓对称加密算法即:加密和解密使用相同密钥的算法。DES加密算法出自IBM的研究,
后来被美国政府正式采用,之后开始广泛流传,但是近些年使用越来越少,因为DES使用56位密钥,以现代计算能力,
24小时内即可被破解。在此基础上加强一下 ,即从DES改变成3DES(或称为Triple DES),即是三重
数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。它相当于是对每个
数据块应用三次DES
加密算法。由于计算机运算能力的增强,原版DES密码的
密钥长度变得容易被暴力破解;3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块
密码算法。
单向加密:通过对数据进行摘要计算生成密文,密文不可逆推还原。算法代表:MD5,SHA;
双向加密:与单向加密相反,可以把密文逆推还原成明文,
双向加密又分为对称加密和非对称加密。
对称加密:指数据使用者必须拥有相同的密钥才可以进行加密解密,就像彼此约定的一串暗号。算法代表:DES,3DES,AES,IDEA,RC4,RC5;
非对称加密:相对对称加密而言,无需拥有同一组密钥,非对称加密是一种“信息公开的密钥交换协议”。非对称加密需要公开密钥和私有密钥两组密钥,公开密钥和私有密钥是配对起来的,也就是说使用公开密钥进行数据加密,只有对应的私有密钥才能解密。这两个密钥是数学相关,用某用户密钥加密后的密文,只能使用该用户的加密密钥才能解密。如果知道了其中一个,并不能计算出另外一个。因此如果公开了一对密钥中的一个,并不会危害到另外一个密钥性质。这里把公开的密钥为公钥,不公开的密钥为私钥。算法代表:RSA,DSA。
public class DESEncryptUtil {
//key 根据实际情况对应的修改,但是key必须是:16位,24位或32位的数据
public static byte[] keybyte = "abcdefghijklmnopqrstuvwx".getBytes();
//定义加密算法:有DES、DESede(即3DES)、Blowfish
private static String Algorithm = "DESede";
private DESEncryptUtil () { }
/**
* 3DES加密
* 即:第一步:初始化密钥和算法类型标准协议配置,
* 第二步:初始化校正加密算法类型,使用加密模式
* 第三步:对数据进行加密,返回加密数据
* @param data
* @return
*/
public static byte[] threeDESEncrypt(String data) {
try {
//SecretKey:是对密钥和算法类型(3DES)进行封装识别的一个标准定义
SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);
Cipher cipher = Cipher.getInstance("DESede");//初始化加密并申明加密算法类型
/**
* Cipher的几种模式:
* .ENCRYPT_MODE:加密模式,
* .DECRYPT_MODE:解密模式
* .WRAP_MODE:对key-value进行包装
* .UNWRAP_MODE:对key-value进行不包装
*/
cipher.init(Cipher.ENCRYPT_MODE, deskey);//如果是加密则使用加密模式,反之
byte[] bytes = cipher.doFinal(data.getBytes());
return bytes;
} catch (Exception ex) {
ex.printStackTrace(); //加密失败,打日志
}
return null;
}
/**
*3DES解密还原文
* 同理,第一步:初始化密钥和算法类型标准协议配置,
* 第二步:初始化校正加密算法类型,使用解密模式
* 第三步:对数据进行解密,返回转换成字符串解密数据
* @param data
* @return
*/
public static String threeDESDecrypt(byte[] data) {
try {
SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);
Cipher cipher = Cipher.getInstance("DESede");
//ENCRYPT_MODE:解密模式
cipher.init(Cipher.DECRYPT_MODE, deskey);
byte[] bytes = cipher.doFinal(data);
return new String(bytes, "utf-8").toString();
} catch (Exception ex) {
ex.printStackTrace();//解密失败,打日志
}
return null;
}
}
Base64编码介绍:
Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,Base64并不是安全领域的加密算法,其实Base64只能算是一个编码算法,对数据内容进行编码来适合传输。如我们在请求地址URL有中文,也会encode转换成编码,到服务器端同理需要处理转换成中文识别。 标准Base64编码解码无需额外信息即完全可逆,即使你自己自定义字符集设计一种类Base64的编码方式用于数据加密,在多数场景下也较容易破解。
主要的就两个方法
:
//
对数据进行编码并返回字符串数据,第一参数为要编码的数据,
//第二参数为编码模式:当前DEFAULT
是默认编码模式,NO_PADDING模式是末尾有“=‘号则省略,NO_WRAP模式是末尾有
//特殊符号都省略掉,如等号,逗号,换行之类(。,= !)
Base64.encodeToString(datas, Base64.DEFAULT);
//
对数据进行解码,但是返回的是byte数组,需要通过String转换后才能返回字符串数据
Base64.decode(datas, Base64.DEFAULT);
//对于Base64的应用,只能在android运行时去调用 ,在测试环境下使用则抛出运行时一场!!!!
public class Base64Util {
private Base64Util() {}
/**
* 对数据进行编码成字符串
* @param datas
* @return
*/
public static String encrypt(byte[] datas) {
return Base64.encodeToString(datas, Base64.DEFAULT);
}
/**
* 对数据进行解码转换成字符串
* @param datas
* @return
*/
public static byte[] decrypt(byte[] datas) {
return Base64.decode(datas, Base64.DEFAULT);
}
}
最后是:Triple DES对称加密Base64编码混合使用
public class DESEncryptUtil {
//key 根据实际情况对应的修改,但是key必须是:16位,24位或32位的数据
public static byte[] keybyte = "123456788765432112345678".getBytes();
//定义加密算法,有DES、DESede(即3DES)、Blowfish
private static String Algorithm = "DESede";
private DESEncryptUtil() {}
/**
* 3DES加密Base64编码成字符串
* 加密流程:
* 第一:对key和算法类型进行封装申明标准配置
* 第二:初始化算法和算法类型,加密模式
* 第三:用3DES加密后用Base64进行编码成中文返回
* @param data
* @return
*/
public static String threeDESToBase64(String data) {
try {
SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);
Cipher cipher = Cipher.getInstance(Algorithm);
cipher.init(Cipher.ENCRYPT_MODE, deskey);
byte[] bytes = cipher.doFinal(data.getBytes());
return Base64.encodeToString(bytes, Base64.DEFAULT);
} catch (Exception ex) {
//加密失败,打日志
ex.printStackTrace();
}
return null;
}
/**
* Base64解码成byte数组后3DES解密还原文
* 解密流程:
* 第一:对key和算法类型进行封装申明标准配置
* 第二:初始化算法和算法类型,解密模式
* 第三:先用Base64进行编码返回byte数组,然后使用3DES解密,之后转换成对应的字符数据,为了防止编码错乱,使用
* UTF-8进行转换
* @param data
* @return
*/
public static String base64ToThreeDES(String data) {
try {
SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);
Cipher cipher = Cipher.getInstance(Algorithm);
cipher.init(Cipher.DECRYPT_MODE, deskey);
byte[] decrypt = Base64.decode(data.getBytes(), Base64.DEFAULT);
byte[] bytes = cipher.doFinal(decrypt);
return new String(bytes, "utf-8").toString();
} catch (Exception ex) {
//解密失败,打日志
ex.printStackTrace();
}
return null;
}
}