最近开发中,遇到业务场景,需要通过接口获取XML报文中一个长度为3000字符串类型的IO图片流,了解后知道是通过BASE64加密的,学习了下BASE64加密。
一、BASE64简介
Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045~RFC2049,上面有MIME的详细规范。Base64编码可用于在HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码具有不可读性,即所编码的数据不会被人用肉眼所直接看到。
二、BASE64的原理
1.假设有3个字符,首先先将他换成10进制ASCII码,然后转成2进制,少位用0补齐,保证8位。
2.因为ASCII码大小是一字节也就是8位,3个8位。又因为3*8=4*6,我们给他分成4分,每份6位。如果少位都用0补齐。
3.把6位码前2位加两个0,比如010000转完后就是00010000,这对计算机来说比较重要,变成了8位码。
4.将4个8位(也就是一字节)码按照RFC里的BASE64标准换算,下面也提供了标准表。
这样我们就得到了QVNU,也就是AST加密的结果。
下面是标准的BASE64编码表。
三、BASE64的应用场景
其实BASE64不是用来加密的。经过BASE64编码后的字符串,全部都是由标准键盘上面的常规字符组成,这样编码后的字符串在网关之间传递不会产生UNICODE字符串不能识别或者丢失的现象。其实EMAIL就是用base64编码过后再发送的。然后接收的时候再还原。还有一种情况下用BASE64编码也很好,比如一个图片文件,或者其他任何二进制文件。我可以把它编码成字符串。这样用XML或者数据库就能直接以文本的方式来存储这些文件了。
四、BASE64的加密和解密
前端使用js: pwd = new Base64.encode(pwd); 后端使用java, new Base64().decodeBase64(pwd.getBytes()).toString(); java的Base64()有提供decode和decodeBase64()这俩种方法,我习惯的以为是decode(),结果却是后者. 下面是我编写的一个小的测试例子,利用sun jdk自带的sun.misc.BASE64Decoder进行加密和解密 也可以通过很多第三方的开源JAR包进行加密解密,如:apache的commons-codec
import java.io.UnsupportedEncodingException; import sun.misc.*; /** * Created by Tanyunlong on 2016/10/18. */ public class Base64Test { public static void main(String args[]){ String code="JDLKAHJKDAHJKDHASJKDHASJKHDKJASD"; String Base64Code=""; Base64Code=getbase64(code); System.out.println(Base64Code); String base64Code="SkRMS0FISktEQUhKS0RIQVNKS0RIQVNKS0hES0pBU0Q="; String result=getfromBase64(base64Code); System.out.println(result); } /** * Base 加密 * @param code * @return result */ public static String getbase64(String code){ byte[] b =null; String result=null; try { b=code.getBytes("utf-8"); }catch (UnsupportedEncodingException e){ e.printStackTrace(); } System.out.println("==============="+b); if (b!=null){ result=new BASE64Encoder().encode(b); } return result; } /** * 解密 * */ public static String getfromBase64(String baseCode){ byte[] b=null; String result=null; if (baseCode!=null){ BASE64Decoder decoder=new BASE64Decoder(); try { b=decoder.decodeBuffer(baseCode); result = new String(b, "utf-8"); }catch (Exception e){ e.printStackTrace(); } } return result; } }