加密方式之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;

    }




}












### Base64加密方式的特点 Base64是一种基于64个可打印字符来表示二进制数据的编码方法[^1]。这种编码方式并不是为了提供安全性,而是主要用于解决传输过程中可能出现的数据损坏或丢失问题。 #### 编码原理 Base64通过将三个字节转换成四个ASCII字符的方式工作。具体来说: - 输入数据被分割成每组24位(即3个8位字节) - 这些24位再细分为四部分,每一部分为6位 - 每个6位序列映射到一个特定范围内的ASCII字符表中的位置,形成最终输出字符串的一部分 ```python import base64 original_data = b'example' encoded_data = base64.b64encode(original_data) print(encoded_data.decode('utf-8')) ``` 此过程确保了即使在网络上传输时遇到特殊字符处理不当的情况,也可以保持原始数据不变形。 #### 特征总结 - **非保密性**:Base64并不属于真正的加密技术;它只是简单地改变了数据的表现形式,并未增加任何实质性的保护措施。 - **体积增大**:经过Base64编码后的文本会比原文件大约三分之一左右。 - **广泛适用性**:适用于多种场景下的数据编码需求,特别是当需要在只支持7-bit ASCII字符集环境中传递任意类型的二进制信息时非常有用。 ### Base64的主要用途 - **电子邮件附件**:MIME协议规定,在发送邮件时如果包含非纯文本的内容,则需采用Base64或其他类似的机制来进行适当编码。 - **URL参数嵌入**:有时为了让某些复杂结构能够作为查询串的一部分而不会引起解析错误,也会利用Base64进行预处理。 - **图像内联显示**:网页开发中可以直接把图片转成Base64格式并直接写入HTML标签里,从而减少HTTP请求次数提高加载速度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值