严格意义上来说,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() ———————————————— 版权声明:本文为CSDN博主「咕噜咕叽」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_36898043/java/article/details/82746671 |