jdk中的 Base64加密解密

嚴格意義上來說,JDK中的Base64不屬於正兒八經的加密,只是爲了不讓密碼過於明顯而已。

一、JDK1.7以前

       JDK1.7加密後的密碼用JDK1.8的進行解密會失敗,原因是JDK1.7加密的內容後多了一行空白。

        java中,Base64在JDK1.7以前,有自帶的加密解密類,具體的實現原理自行百度。JDK中Base64的實現在JDK1.7之前是沒有對外的公共接口的,只有一個非標準實現,位於sun.misc包中,提供BASE64Encoder類和BASE64Decoder類。由於是不對外,所以不建議使用,並且後續JDK版本可能會去掉對這兩個類的支持

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

1、加密

/**
 * 將密碼 加密
 * @param password 密碼明文
 * @param charset 編碼格式
 * @return 加密後的密碼
 */
public static String encryptByBase64(String password, String charset) {
    String encryptPwd = null;
    byte[] bytes = null;
    try {
        bytes = password.getBytes(charset);
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    if (bytes != null) {
        encryptPwd = new BASE64Encoder().encode(bytes);
    }
    return encryptPwd;
}

2、解密

/**
 * 將加密後的密碼解密
 * @param encryptPwd 加密後的密碼
 * @param charset 編碼格式
 * @return 密碼明文
 */
public static String decryptByBase64(String encryptPwd, String charset) {
    String password = null;
    if (encryptPwd != null && !"".equals(encryptPwd.trim())) {
        byte[] bytes;
        try {
            bytes = new BASE64Decoder().decodeBuffer(encryptPwd);
            password = Arrays.toString(bytes);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return password;
}

二、JDK1.8之後

       在JDK1.8之後,這個問題就不復存在了。JDK1.8提供了一個完整的類用於實現Base64編碼解碼,這個類是 java.util.Base64。以後我們如果需要對Base64編碼解碼,就可以使用這個類來完成了。Base64提供了一套用於獲取編碼器和解碼器的靜態方法,其中大致分爲三類:Basic編碼器  URL和文件安全編碼器  MIME編碼器。

Basic編碼器:

import java.util.Base64;

1、加密(最基本的)

/**
 * 將密碼 加密
 * @param password 密碼明文
 * @param charset 編碼格式
 * @return 加密後的密碼
 */
public static String encryptByBase64_jdk8(String password, String charset) {// UTF-8
    String encryptPwd_jdk8 = null;
    try {
        encryptPwd_jdk8 = Base64.getEncoder().encodeToString(password.getBytes(charset));
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    return encryptPwd_jdk8;
}

2、解密

/**
 * 將加密後的密碼解密
 * @param encryptPwd 加密後的密碼
 * @param charset 編碼格式
 * @return 密碼明文
 */
public static String decryptByBase64_jdk8(String encryptPwd, String charset) {// UTF-8
    String password = null;
    byte[] bytes = Base64.getDecoder().decode(encryptPwd);
    try {
        password = new String(bytes, charset);
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    return password;
}

URL和文件安全編碼器:

        URL編碼和Basic編碼有些不同,主要是URL中反斜槓 /有特殊的含義,直接編碼會不太安全。

1、加密

/**
 * 將url 加密
 * @param url url 如 http://www.baidu.com
 * @param charset  編碼格式
 * @return 加密後的url
 */
public static String encryptByBase64URL_jdk8(String url, String charset) {// UTF-8
    String encryptPwdURL_jdk8 = null;
    try {
        encryptPwdURL_jdk8 = Base64.getUrlEncoder().encodeToString(url.getBytes(charset));
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    return encryptPwdURL_jdk8;
}

2、解密

/**
 * 將加密後的url 解密
 * @param encryptURL 加密後的url
 * @param charset 編碼格式
 * @return url
 */
public static String decryptByBase64URL_jdk8(String encryptURL, String charset) {// UTF-8
    String url = null;
    byte[] decode = Base64.getUrlDecoder().decode(encryptURL);
    try {
        url = new String(decode,charset);
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    return url;
}

MIME編碼器:

       MIME編碼適用於MIME格式數據,編碼後每行的輸出不超過76個字符,結束符號爲\r\n。MIME格式就是文件的表達形式,比如 image/png,video/mp4等。

1、加密:

Base64.getMimeEncoder().encodeToString(bytes)

2、解密   

Base64.getMimeDecoder().decode()

   

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章