加密方式之BASE64

来源:互联网 发布:北上战舰世界数据 编辑:程序博客网 时间:2024/05/22 17:26

       最近开发中,遇到业务场景,需要通过接口获取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;    }}




0 0
原创粉丝点击