加密方式之BASE64

       最近开发中,遇到业务场景,需要通过接口获取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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值