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

简单了解

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

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

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

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

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

java代码实现

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

 package com.wang.encryption;
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import java.io.IOException;
/**
* @author yogo.wang
* @date 2016/11/03-下午3:58.
*/
public class Base64Test { public static void main(String[] args) throws IOException { String msg="wang";
byte[] bys=msg.getBytes("utf-8"); /**
* 使用BASE64 加密(编码)
*/
//第一种方式
BASE64Encoder base64Encoder=new BASE64Encoder();
String s = base64Encoder.encodeBuffer(bys);
System.out.println(s);
System.out.println("---------------------");
//第二种方式
String s1 = Base64.encode(bys);
System.out.println(s1);
System.out.println("---------------------");
/**
* 使用BASE64 解密(解码)
*/
//第一种方式
BASE64Decoder base64Decoder=new BASE64Decoder();
byte[] bys2 = base64Decoder.decodeBuffer(s);
System.out.println(new String(bys2));
System.out.println("---------------------");
//第二种方式
byte[] bys3 = Base64.decode(s);
System.out.println(new String(bys3)); }
}

输出结果如下:

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编码表对应找出相应的字符

  对应下面的图:

  因为每三个常规字符,对应四个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编码后的字符串很大,反而影响加载速度.

  

java单向加密算法小结(1)--Base64算法的更多相关文章

  1. java单向加密算法小结(2)--MD5哈希算法

    上一篇文章整理了Base64算法的相关知识,严格来说,Base64只能算是一种编码方式而非加密算法,这一篇要说的MD5,其实也不算是加密算法,而是一种哈希算法,即将目标文本转化为固定长度,不可逆的字符 ...

  2. Java加密技术(一)——BASE64与单向加密算法MD5&SHA&MAC

    Java加密技术(一)——BASE64与单向加密算法MD5&SHA&MAC 博客分类: Java/Security Javabase64macmd5sha     加密解密,曾经是我一 ...

  3. BASE64与单向加密算法MD5&SHA&MAC

    言归正传,这里我们主要描述Java已经实现的一些加密解密算法,最后介绍数字证书.     如基本的单向加密算法: BASE64 严格地说,属于编码格式,而非加密算法 MD5(Message Diges ...

  4. java Base64算法的使用

    Base64是常见的网络加密算法,Base64编码可用于在HTTP环境下传递较长的标识信息.详见 Base64介绍 1 自定义的base64算法 Base64Encrypt.java public c ...

  5. 常用加密算法的Java实现(一) ——单向加密算法MD5和SHA

    1.Java的安全体系架构 1.1           Java的安全体系架构介绍 Java中为安全框架提供类和接口.JDK 安全 API 是 Java 编程语言的核心 API,位于 java.sec ...

  6. MD5加密算法(信息摘要算法)、Base64算法

    1 什么是MD5 信息摘要算法,可以将字符进行加密,每个加密对象在进行加密后都是等长的 应用场景:将用户密码经过MD5加密后再存储到数据库中,这样即使是超级管理员也没有能力知道用户的具体密码是多少:因 ...

  7. java基础---->Base64算法的使用

    Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,可用于在HTTP环境下传递较长的标识信息.详细的Base64信息,可以参见维基百科:https://en.wikipedia.org ...

  8. java Base64算法

    Base64算法并不是加密算法,他的出现是为了解决ASCII码在传输过程中可能出现乱码的问题.Base64是网络上最常见的用于传输8bit字节码的可读性编码算法之一.可读性编码算法不是为了保护数据的安 ...

  9. java基本加密算法

    简单的java加密算法有: BASE64 严格地说,属于编码格式,而非加密算法 MD5(Message Digest algorithm 5,信息摘要算法) SHA(Secure Hash Algor ...

随机推荐

  1. Unity3d学习 预设体(prefab)的一些理解

    之前一直在想如果要在Unity3d上创建很多个具有相同结构的对象,是如何做的,后来查了相关资料发现预设体可以解决这个问题! 预设体的概念: 组件的集合体 , 预制物体可以实例化成游戏对象. 创建预设体 ...

  2. RxJS + Redux + React = Amazing!(译一)

    今天,我将Youtube上的<RxJS + Redux + React = Amazing!>翻译(+机译)了下来,以供国内的同学学习,英文听力好的同学可以直接看原版视频: https:/ ...

  3. Ignite性能测试以及对redis的对比

    测试方法 为了对Ignite做一个基本了解,做了一个性能测试,测试方法也比较简单主要是针对client模式,因为这种方法和使用redis的方式特别像.测试方法很简单主要是下面几点: 不作参数优化,默认 ...

  4. SQL Server on Linux 理由浅析

    SQL Server on Linux 理由浅析 今天的爆炸性新闻<SQL Server on Linux>基本上在各大科技媒体上刷屏了 大家看到这个新闻都觉得非常震精,而美股,今天微软开 ...

  5. .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法

    .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法 0x00 为什么需要Map(MapWhen)扩展 如果业务逻辑比较简单的话,一条主管道就够了,确实用不到 ...

  6. .NET平台开源项目速览(16)C#写PDF文件类库PDF File Writer介绍

    1年前,我在文章:这些.NET开源项目你知道吗?.NET平台开源文档与报表处理组件集合(三)中(第9个项目),给大家推荐了一个开源免费的PDF读写组件 PDFSharp,PDFSharp我2年前就看过 ...

  7. 【开源】分享2011-2015年全国城市历史天气数据库【Sqlite+C#访问程序】

    由于个人研究需要,需要采集天气历史数据,前一篇文章:C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子),介绍了基本的采集思路和核心代码,经过1个星期的采集,历史数据库 ...

  8. Mac OS 使用 Vagrant 管理虚拟机(VirtualBox)

    Vagrant(官网.github)是一款构建虚拟开发环境的工具,支持 Window,Linux,Mac OS,Vagrant 中的 Boxes 概念类似于 Docker(实质是不同的),你可以把它看 ...

  9. VICA 架构设计(1)

    本文记录最近完成的一个通用实时通信客户端的架构.   背景 我们公司是做税务相关的软件,有针对大客户 MIS 系统,也有针对中小客户的 SaaS 平台.这些系统虽然都是 B/S 的,但是也需要使用 A ...

  10. 利用PowerShell复制SQLServer账户的所有权限

    问题 对于DBA或者其他运维人员来说授权一个账户的相同权限给另一个账户是一个很普通的任务.但是随着服务器.数据库.应用.使用人员地增加就变得很枯燥乏味又耗时费力的工作.那么有什么容易的办法来实现这个任 ...