jdk中的 Base64加密解密

本文探讨了JDK中Base64的使用,指出在JDK1.7以前,Base64编码解码依赖于非公开的sun.misc包,而在JDK1.8之后,提供了java.util.Base64类,支持Basic、URL和MIME三种编码方式。JDK1.7的加密内容在JDK1.8下解密可能失败,主要由于额外的空行问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

严格意义上来说,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()

   

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值