Java8新特性Base64结合MD5对称加密

作者: Ian | 2018-08-11 | 阅读

参考:OSC闲人 – https://my.oschina.net/benhaile/blog/267738

引言

前面介绍Java8的新特性Base64,后面直接上标题的整合代码。

介绍BASE64

BASE64 编码是一种常用的字符编码,在很多地方都会用到。但base64不是安全领域下的加解密算法。能起来安全作用的效果很差,而且很容易破解,它的核心作用应该是传输数据的正确性,有些网关或系统只能使用欧冠ASCII字符。Base64就是用来将非ASCII字符的数据转换成ASCII字符的一种方法,而且base64特别适合在http,mime协议下快速传输数据。

JDK里面实现Base64的API

在JDK1.6之前,JDK核心类一直没有Base64的实现类,有人建议使用Sun/Oracle JDK里面的sun.misc.BASE64Encoder 和 sun.misc.BASE64Decoder,使用它们的优点就是不需要依赖第三方库,缺点就是可能在未来版本会被删除(用maven编译会发出警告),而且性能不佳。

JDK1.6中添加了另一个BASE64的实现,javax.xml.bind.DatatypeConverter 两个静态方法parseBase64Binary 和 printBase64Binary,隐藏在javax.xml.bind 包下面,不被很多开发者知道。

在Java8 java.uitl 包下面实现了BASE64编解码API,而且性能不俗,API也简单易懂,下面展示下这个类的使用例子。

java.uitl.Base64

该类提供了一套静态方法获取下面三种BASE64编解码器:

  1. Basic编码:是标准的BASE64编码,用于处理常规的需求
//编码
String asb64 = Base64.getEncoder().encodeToString("some string".getBytes("utf-8"));

//输出c29tZSBzdHJpbmc=
System.out.println(asB64);

//解码
byte[] asBytes = Base64.getDecoder().decode("c29tZSBzdHJpbmc=");
System.out.println(new String(asBytes,"utf-8"));
/*
输出为:some string
*/
  1. URL编码:使用下划线替换URL里面的反斜线“/”
String urlEncoded = Base64.getUrlEncoder().encodeToString("subjects?abcd".getBytes("utf-8"));
System.out.println("Using URL Alphabet:"+urlEncoded);
//输出为:
Using URL Alphabet: c3ViamVjdHM_YWJjZA==
  1. MIME编码:使用基本的字母数字产生BASE64输出,而且对MIME格式友好:每一行输出不超过76个字符,而且每行以“\r\n”符结束。
StringBuilder sb = new StringBuilder();
for(int t = 0; t < 10; ++t){
    sb.append(UUID.randomUUID().toString());
}
byte[] toEncode = sb.toString().getBytes("utf-8");
String mimeEncoded = Base64.getMimeEncoder().encodeToString(toEncode);
System.out.println(mimeEncoded);

Java8性特性Base64+加解密Demo

public static byte[] decode(String _key, byte[] data) {
        try {
            byte[] key = _key.getBytes("utf-8");
            DESedeKeySpec spec = new DESedeKeySpec(key);
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("desede");
            Key desKey = keyFactory.generateSecret(spec);
            Cipher cipher = Cipher.getInstance("desede/ECB/PKCS5Padding");
            cipher.init(2, desKey);
            return cipher.doFinal(data);
        } catch (Exception var7) {
            var7.printStackTrace();
            return null;
        }
    }

public static void main(String[] args) throws UnsupportedEncodingException {
        String key = MD5.MD5("123456xksquare");
        String str = "{111,222}";
        System.out.println(key);
        String str1 = Base64.getEncoder().encodeToString(encode(key, str));
        System.out.println("加密结果" + str1);
        String out = new String(decode(key, Base64.getDecoder().decode(str1.getBytes("utf-8"))), "utf-8");
        System.out.println("解密参数:" + out);
    }
//工具类
public class Des3Utils {


    protected final static Log logger = LogFactory.getLog(Des3Utils.class);

    public static final String  key = "1234567890qwertyuiopasdf";

    public static Key convertSecretKey =null;

    static {
        try {
            byte[] bytesKey = build3DesKey(key);
            KeyGenerator keyGenerator = KeyGenerator.getInstance("DESede");

            keyGenerator.init(112);
            // KEY转换
            DESedeKeySpec desKeySpec = new DESedeKeySpec(bytesKey);
            SecretKeyFactory factory = SecretKeyFactory.getInstance("DESede");
           convertSecretKey = factory.generateSecret(desKeySpec);

        }catch (Exception e){
            logger.error(e);
        }

    }


    /**
     * 加密
     * @param content
     * @return
     */
    public static String encrypt(String content){

        try {

            // 加密
            Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey);
            byte[] result = cipher.doFinal(content.getBytes());
            return encode(result);
        }catch (Exception e){
            logger.error(e);
        }

        return null;
    }




    /**
     * 解密
     * @param content
     * @return
     */
    public static String decrypt(String content){

        byte[] result = null;
        try {
            Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
            // 解密
            cipher.init(Cipher.DECRYPT_MODE, convertSecretKey);
            result = cipher.doFinal(decode(content));
            return new String(result);
        }catch (Exception e){
            logger.error(e);
        }

        return null;
    }


    /**
     * base64编码
     * @param bstr
     * @return
     */
    public static String encode(byte[] bstr){
        return new sun.misc.BASE64Encoder().encode(bstr);
    }


    /**
     * base64解码
     * @param str
     * @return string
     */
    public static byte[] decode(String str){
        byte[] bt = null;
        try {
            sun.misc.BASE64Decoder decoder = new sun.misc.BASE64Decoder();
            bt = decoder.decodeBuffer( str );
        } catch (IOException e) {
            e.printStackTrace();
        }
        return bt;
    }


    public static byte[] build3DesKey(String keyStr) throws UnsupportedEncodingException {
        byte[] key = new byte[24];    //声明一个24位的字节数组,默认里面都是0
        byte[] temp = keyStr.getBytes("UTF-8");    //将字符串转成字节数组
        /*
         * 执行数组拷贝
         * System.arraycopy(源数组,从源数组哪里开始拷贝,目标数组,拷贝多少位)
         */
        if(key.length > temp.length){
            //如果temp不够24位,则拷贝temp数组整个长度的内容到key数组中
            System.arraycopy(temp, 0, key, 0, temp.length);
        }else{
            //如果temp大于24位,则拷贝temp数组24个长度的内容到key数组中
            System.arraycopy(temp, 0, key, 0, key.length);
        }
        return key;
    }

    public static void main(String[] args) throws Exception{

        //String b = decrypt(URLDecoder.decode("%2BtZILuHyeRoLXkX7qnW1rrCRWfm7IOjV", "utf-8"));
        String  e = URLEncoder.encode("dIGjPfvHm6E=", "utf-8");
        System.out.println(e);

    }
}



  相关文章:


留言区:

TOP