java单向加密算法小结(1)--Base64算法

小编 2026-07-15 阅读:786 评论:0
  从这一篇起整理一下常见的加密算法以及在java中使用的demo,首先从最简单的开始.简单了解...

  从这一篇起整理一下常见的加密算法以及在java中使用的demo,首先从最简单的开始.

简单了解

     Base64严格来说并不是一种加密算法,而是一种编码/解码的实现方式.

  我们都知道,数据在计算机网络之间是使用字节流的方式进行传递的,所有的信息都要最终转换为0101的二进制,这本身就涉及到编码,解码的应用.

  Base64,顾名思义,是使用了64个基本的字符来对任意数据进行编码的一种实现方式,那既然有Base64,是不是也有Base32,Base16呢? 答案是没错,有.

  下面先看一下Base64的编码表:

     java单向加密算法小结(1)--Base64算法

  由图可见,Base64使用了26个字母的大小写,也就是52个字符,再加上10个数字和两个特殊的"+","/"组成,一共64个字符,其中最后两个字符选取不一定总是这两个.

java代码实现

  首先看代码,然后再细说Base64实现的原理和应用:

 1 package com.wang.encryption; 2 import com.sun.org.apache.xerces.internal.impl.dv.util.Base64; 3 import sun.misc.BASE64Decoder; 4 import sun.misc.BASE64Encoder; 5 import java.io.IOException; 6 /** 7  * @author yogo.wang 8  * @date 2016/11/03-下午3:58. 9  */10 public class Base64Test {11 12     public static void main(String[] args) throws IOException {13 14         String msg="wang";15         byte[] bys=msg.getBytes("utf-8");16 17         /**18          * 使用BASE64 加密(编码)19          */20         //第一种方式21         BASE64Encoder base64Encoder=new BASE64Encoder();22         String s = base64Encoder.encodeBuffer(bys);23         System.out.println(s);24         System.out.println("---------------------");25         //第二种方式26         String s1 = Base64.encode(bys);27         System.out.println(s1);28         System.out.println("---------------------");29         /**30          * 使用BASE64 解密(解码)31          */32         //第一种方式33         BASE64Decoder base64Decoder=new BASE64Decoder();34         byte[] bys2 = base64Decoder.decodeBuffer(s);35         System.out.println(new String(bys2));36         System.out.println("---------------------");37         //第二种方式38         byte[] bys3 = Base64.decode(s);39         System.out.println(new String(bys3));40 41 42     }43 }

输出结果如下:

d2FuZw==

---------------------
d2FuZw==
---------------------
wang
---------------------
wang

原理和应用

  根据代码,可以看到,字符"wang"通过Base64的编码转化成了一个字符串"d2FuZw==",那么到底内部是怎么实现的呢?

  Base64使用了64的字符,那么只需要6个二进制位就可以表示,但是一个Base64字符是8个二进制位的,即8Bit,也就是说Base64在6Bit的基础上在左边加了俩0,所有它的左边两位永远为0.

  我们知道,一个字符是占了8位的,那怎么用6Bit表示8Bit的数呢,这好办,因为8和6的最小公倍数是24,那么,我用4个Base64的字符来表示3个常规的字符就可以了.

  知道了这些,我们就可以来看看"wang"这个字符串是怎么被编码成"d2FuZw=="的了.

  第一步:把常规字符转换为ASCII.

  第二步:把ASCII码转为8位2进制

  第三步:每6位2进制数划为一组

  第四步:将2进制转为10进制

  第五步:根据Base64编码表对应找出相应的字符

  对应下面的图:

java单向加密算法小结(1)--Base64算法

  因为每三个常规字符,对应四个Base64字符,如果不够的话,会在后边补0,这里的"wang"是4个字符,不是3的整数倍,所以需要补0,那为什么编码的结果是"d2FuZw==",而不是"d2FuZwAA"呢? 

  原因其实也很简单,因为最后两个AA是没有实际意义的,并不携带有效信息,为了解码方便,Base64编码选择了使用"="来代替最后的"A",所以就是我们看到的"d2FuZw=="了.

  通过以上的过程我们可以发现,其实Base64是一种编码方式而非加密方式,因为它的编码解码过程是完全可逆的,且不需要额外信息,你只要有一张Base64的编码表就可以了,所以,不要将他用于对数据的加密.

Base64的应用

  说了这么多,好像还是不太明白这种编码有什么必须存在的理由.....

  我们知道在计算机中任何数据都是按ascii码存储的,而ascii码的128~255之间的值是不可见字符。而在网络上交换数据时,比如说从A地传到B地,往往要经过多个路由设备,由于不同的设备对字符的处理方式有一些不同,这样那些不可见字符就有可能被处理错误,这是不利于传输的。所以就先把数据先做一个Base64编码,统统变成可见字符,这样出错的可能性就大降低了(这段来自知乎)。

  不仅如此,比如说我们可以使用HTML来内嵌Base64编码的图片,这样就避免了不必要的外部资源加载,不过还是要量力而为,这种场景一般适用于尺寸比较小的图片,如果是高清图片,用这种方式会导致Base64编码后的字符串很大,反而影响加载速度.

  

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
标签列表