3DES对称加密和Base64编码双重使用加密数据

在我们日常开发中,对数据加密是必不可少的一项设计,主要是为了数据能在网络上安全的进行传输。
如果不对数据加密则容易被抓包工具抓取和破解,如果加密过于简单,也很容易被逆向破解。
所以,为确保数据传输和数据存储的安全,可通过特定的算法,将数据明文进行摘要加密成复杂的密文后才进行传输。
目前主流加密手段大致可分为单向加密和双向加密,下面使用的方式是双向加密可逆算法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;
    }
}




你可能感兴趣的:(数据加密)