base64编码,(二)base64编码的前世今生
base64编码,(二)base64编码的前世今生详细介绍
本文目录一览: base64编码是什么?
Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。可查看RFC2045~RFC2049,上面有MIME的详细规范。
Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。采用Base64编码具有不可读性,需要解码后才能阅读。
Base64由于以上优点被广泛应用于计算机的各个领域,然而由于输出内容中包括两个以上“符号类”字符(+, /, =),不同的应用场景又分别研制了Base64的各种“变种”。为统一和规范化Base64的输出,Base62x被视为无符号化的改进版本。
扩展资料:
Base64编码可用于在HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的一个标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。
在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到。
base64是什么编码方式?
Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。
1,Base64 使用US-ASCII子集的64个字符,即大小写的26个英文字母,0-9,+,/。
2,编码总是基于3个字符,每个字符用8位二进制表示,因此一共24位,再分为4四组,每组6位,表示一个Base64的值。
3,Base64值为0就是A,为27的就是b。这样,每3个字符产生4位的Base64字符。如果被加密的字符串每3个一组,还剩1或2个字符,使用特殊字符"="补齐Base64的4字。
扩展资料:
应用
Base64编码可用于在HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的一个标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。
在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到。
然而,标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式,而这些“%”号在存入数据库时还需要再进行转换。
因为ANSI SQL中已将“%”号用作通配符。
为解决此问题,可采用一种用于URL的改进Base64编码,它不仅在末尾去掉填充的'='号,并将标准Base64中的“+”和“/”分别改成了“-”和“_”。
这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。
另有一种用于正则表达式的改进Base64变种,它将“+”和“/”改成了“!”和“-”,因为“+”,“/”以及前面在IRCu中用到的“[”和“]”在正则表达式中都可能具有特殊含义。
此外还有一些变种,它们将“+/”改为“_-”或“._”(用作编程语言中的标识符名称)或“.-”(用于XML中的Nmtoken)甚至“_:”(用于XML中的Name)。
参考资料来源:百度百科-base64
Base64编码
使用说明 1)从 iOS7.0 开始,苹果就提供了base64的编码和解码支持 2)如果是老项目,则还能看到base64编码和解码的第三方框架,如果当前不再支持iOS7.0以下版本,则建议替换。 描述 Base64可以成为密码学的基石,非常重要。
特点
结果 所有的数据都能被编码为并只用 65 个字符就能表示的 文本文件 。 65字符
对文件进行base64编码后文件数据的变化
Base64加密原则 :
对ABC进行Base64编码过程
注:Base64字符表,包括 大写A-Z小写a-z数字0-9 和 + 以及 / 。
下面看一下Base64相关的API
这里还有两个枚举,分别对应编码encode和解码decode的option。
下面具体看一下这几个枚举的含义:
下面看一下枚举的具体含义:
参考: https://www.jianshu.com/p/4f4e7288c90e
base64编码是什么意思啊?
分类: 电脑/网络 >> 互联网
问题描述:
是不是邮件如果不是base64编码就发不了
那我以WEB方式写的邮件是base64编码吗?
如果不是那么为什么可以正常发送呢?
解析:
Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,在发送电子邮件时,服务器认证的用户名和密码需要用Base64编码,附件也需要用Base64编码。
下面简单介绍Base64算法的原理,由于代码太长就不在此贴出
Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。
转换后,我们用一个码表来得到我们想要的字符串(也就是最终的Base64编码),这个表是这样的:
0 A 17 R 34 i 51 z
1 B 18 S 35 j 52 0
2 C 19 T 36 k 53 1
3 D 20 U 37 l 54 2
4 E 21 V 38 m 55 3
5 F 22 W 39 n 56 4
6 G 23 X 40 o 57 5
7 H 24 Y 41 p 58 6
8 I 25 Z 42 q 59 7
9 J 26 a 43 r 60 8
10 K 27 b 44 s 61 9
11 L 28 c 45 t 62 +
12 M 29 d 46 u 63 /
13 N 30 e 47 v
14 O 31 f 48 w (pad) =
15 P 32 g 49 x
16 Q 33 h 50 y
原文的字节最后不够3个的地方用0来补足,转换时Base64编码用=号来代替。这就是为什么有些Base64编码会以一个或两个等号结束的原因,但等号最多只有两个。
举一个例子,abc经过Base64编码以后的结果是YWJj.
发邮件的时候所写的信息自动在后台转换然后传输...
base64编解码与hash加密
利用base64可以将二进制数据编码为64个字符组成的字符串,64个字符为a-z,A-Z,0-9,+,/。base64编码是将三个字节的二进制数据编码为四个字节的字符数据,如果字节数不为3的倍数base64会将 \x00 补在末尾,所以会常在base64字符串的末尾见到一个或者两个的 = 号。
base64编码
base64解码
小技巧:遇到base64编码的二进制文件可以直接解码用io字节流接收再用其他模块加载,无需在本地保存文件再使用其他模块加载。
哈希加密是对字符串进行加密,其加密后的散列值不可逆,即hash加密是单向加密不可解。python内置的hashlib库提供了md5, SHA1, SHA224, SHA256, SHA384, SHA512 加密算法的支持
01加密方式-Base64编码
说明 HTTP将Base64编码用于基本的认证和摘要认证。 其可以方便的将用户的任何输入转换成只包含特定字符的安全格式,服务于网络通信过程。 特点 1)可以将任意的二进制数据进行Base64编码。 2)所有的数据都能被编码为并只用65个字符就能表示的文本文件。 3)编码后的65个字符包括A Z,a z,0~9,+,/,= 4)对文件或字符串进行Base64编码后将比 原始大小增加33% 。 5)能够逆运算 6)不够安全,但却被很多加密算法作为编码方式
1)将所有字符转化为ASCII码; 2)将ASCII码转化为8位二进制; 3)将二进制3个归成一组(不足3个在后边补0)共24位,再拆分成4组,每组6位; 4)统一在6位二进制前补两个0凑足8位; 5)将补0后的二进制转为十进制; 6)从Base64编码表获取十进制对应的Base64编码;
a.转换的时候,将三个byte的数据,先后放入一个24bit的缓冲区中,先来的byte占高位。 b.数据不足3byte的话,则剩下的bit用0补足。每次取出6个bit,按照其值选择查表选择对应的字符作为编码后的输出。 c.不断进行,直到全部输入数据转换完成。 d.如果最后剩下两个输入数据,在编码结果后加1个“=”; e.如果最后剩下一个输入数据,编码结果后加2个“=”; f.如果没有剩下任何数据,就什么都不要加,这样才可以保证资料还原的正确性。
运行效果图
(二)base64编码的前世今生
1.?? 什么是BASE64编码
BASE64就是一种基于64个可打印字符来表示二进制数据的方法。换句话说,就是将二进制数编码成为64个可打印字符(符合ASCII编码规则)。
2.?? 为什么会出现BASE64 编码
最早的邮件系统只处理ASCII编码,ASCII码为7位有效码,一共包括。因此旧的邮件系统就会以为收到的8位字节码都是以ASCII编码的,并不理会最高位,或者简单粗暴的处理最高位,如:截断最高位。
后来,邮件的内容越来越丰富了,人们不仅想传输英文字符,还想传输如:中文(各种不同的编码),图片、视频(二进制文件)等更加丰富的内容。然而,这些内容的编码超出了ASCII码的范围,若不加以处理,这些编码在经过旧的邮件系统时,若最高位被截断了,信息就损失了,接收方没有办法判断发送过来的字符最高位是0还是1,也就无法正确还原发送方发出的数据。
怎么办呢?很简单,就是发送方把这些内容按照一定规则重新编码成符合ASCII码格式的编码,使其能够顺利通过那些问题邮件系统而不会有信息损失,接收方再按照对应的规则还原回来。
于是,当当当,BASE64应运而生,这样所有的二进制都可以转换成ASCII编码格式进行传输了。
3.?BASE64 编码规则
1. BASE64编码基于以下64个可打印字符:A-Z、a-z、0-9、+、/。64个字符只需要使用6个bit即可完全表示(2的6次方为64)。
2. 二进制字符串转换成BASE64的方法是:
(1)每3个8位字符分隔为4个6位字符。(因为Base64的编码只有6个bit即可表示,而正常的字符是使用8个bit表示, 8和6的最小公倍数是24,所以4个Base64字符可以表示3个8位字符)。
(2)在6位字符的最高2位补0,查表可得对应的可打印字符。
(3)当二进制字节数少于3个,即二进制bit数不是6的倍数时:二进制位数补零直到bit数为6的最小公倍数,再按6位分隔查表得到对应的BASE64可打印字符;最后,将编码结果用“=”补齐为4个字符。【why?为了与原码中本来有的0进行区别】
例:将a进行BASE64编码为YQ==
4.?? BASE64 的应用场景
什么情况下需要用到BASE64编码呢?那取决于BASE64都能做什么。经过BASE64编码后,数据变成了64个ASCII编码的数据,也就是说:
?密码均是常用可见的字符
?密码均由64个常用字符组成
?无法一眼看出密码的内容
对应的,使用BASE64密码的动机可以归纳为:
?将不可见字符转换为可见字符
?对消息格式进行保护
?对消息内容进行简单保护(防君子不防小人)
(1)将不可见字符转换为可见字符
? 网页中图片等二进制数据的BASE64编码
(参考: http://www.webhek.com/post/data-url.html )
前端在实现页面时,对于一些简单的图片,为了避免浏览器加载外部资源,可以将图片内容直接嵌入到网页里。这就是浏览器的Data
URLs 的特性,它可以优化网站加载速度和执行效率。图片数据是二进制数据,没有办法描述。使用Base64对图片或其他文件的二进制数据进行编码后,这些数据就变成了可见字符。
(2)对消息格式进行保护
与邮件系统处理非ASCII编码会遇到的问题类似,其基本目的是保证发送方发出的内容经过网络传输后能够被正确的还原。这是处理包含特殊字符的消息最简单有效的实现方式,避免了发送方和接收方对消息中的字符进行逐个处理的复杂性。
? URL 与Cookie
URL通常以冒号和斜杠来对URL的内容进行分隔。URL中还会传递一些用户输入、二进制数据等参数。当这些内容中包含了冒号和斜杠等特殊字符时,若不加以处理,会影响WEB系统对URL格式的解析。因此,将参数内容进行BASE64编码以后再进行传输,就可以降低系统处理特殊字符的复杂性。同时发送者和接收者无须担心传输的内容会破坏HTTP分析程序的冒号、换行符或二进制值。
? Cookie
(参考: https://www.cnblogs.com/andy-zhou/p/5360107.html#_caption_0 )
Cookie是服务器通过HTTP头发送给客户端的数据,为了在HTTP头部无损的传递这些消息内容,通常也需要对cookie的内容进行base64编码。通常在cookie中传递的二进制数据包括图片、证书等。
注:由于标准的Base64编码后可能出现字符+和/,在URL中就不能直接作为参数,所以又有一种"url safe"的base64编码,其实就是把字符+和/分别变成-和_。
? 结构化文本
( 参考: https://blog.csdn.net/qq_27274997/article/details/78215934 )
一个xml当中包含另一个xml数据,此时如果将xml数据直接写入显然不合适,将xml进行适当编码存入较为方便,事实上xml当中的字符一般都是可见字符(0-127之间),但是由于中文的存在,可能存在不可见字符,直接将字符打印在外层xml的数据中显然不合理,那么怎么办呢?可以使用base64进行编码,然后存入xml,解码反之其实还有个办法,将byte的值写在xml当中,空格或者,分开,这样也可以将byte数据传入,不过这样更浪费空间,并且不易保存。
(3)对消息内容进行简单保护(防君子不防小人,防外行不防内行),就不解释了。
??? (参考: https://blog.csdn.net/waf1314/article/details/5107400 )
?
5.? BASE64 的误用
BASE64不能用于信息加密!很容易破解!
Base64算法原理及实现
Base64算法最开始是被用于解决电子邮件数据传输问题。在早期,由于历史原因问题,电子邮件只允许使用ASCII字符,如果在邮件中出现了非ASCII字符,在通过某些网关进行数据转发的时候,网关会对这些非ASCII字符做出调整,例如,把ASCII码8位二进制码的最高位置为0。此时接收方在收到邮件时就会出现乱码。基于这个原因,产生了Base64算法。
Base64编码的思路说白了,就是把传输数据的每个字节映射成ASCII码表中的某些字符,这样在传输的过程中,就不会出现乱码的问题了。Base64算法定义了一个映射表,如下所示。
由上表可以看出,之所以称为Base64编码,实际上是把原数据映射成了ASCII码表中的64个字符。但是,64个字符最多能映射的位数是6bit。但是每个数据是8bit的,那怎么转换呢?Base64编码的基本思想: 将原数据每3个字节(24bit)分为一组,然后将这24bit数据按照每6bit一组,重新划分为4组,分组完成之后,再将每每6bit数据为单元进行映射。 Base64编码的基本流程如下:
例如,将字符串"ABC"进行Base64编码流程如下。
所以,字符串"ABC"经过Base64编码后的数据是"QUJD"。
从Base64编码的原理可以看到,Base64实际上就是把原来数据中的每3个字节一组进行Base64编码转换,编码之后变成4个Base64字符。但是如果原文数据长度不是3的整数倍的时候该怎么办呢?Base64算法规定,如果待加密数据不是3的整数倍,就在原文数据后面补0,直到长度凑够3的整数倍为止,然后再进行Base64编码转换。待编码转换完成之后,在结果末尾补充相同个数的"="。 例如,将字符串"ABCD"进行Base64编码流程如下。
所以,字符串"ABC"经过Base64编码后的字符串是"QUJDRA=="。
其实这里有个规律,当原文的数据长度除以3余数为0时,编码之后后面没有"=";当余数为1时,后面有两个"=",当余数是2时,后面有一个"=","="的个数也就是补充的字节数。
通过Base64的原理可以看到,Base64编码实际上是把原数据的3个字节映射成了4个字节,所以相比于原数据长度,编码后的长度会增加1/3。这也会降低传输效率。
Get方式和Post方式是Http请求常用的两种方式,某些情况下会要求使用Get方式来传递二进制数据。这时,可以先通过Base64编码来将二进制数据转换成字符串数据。由于符号"+"和符号"/"是不允许出现在Url中的,所以,产生了Url安全的Base64算法,所谓的Url安全的Base64算法,其实主要包含两个方面。
目前,在Java中,我们可以通过以下方式来是使用Base64算法。
在java8之前,JDK官方库中都没有内置Base64算法,其实Base64实现很简单,这个不知道为什么。但是Java8内置了Base64编码器和解码器。 在Java8中,Base64工具类提供了三种BASE64编解码器: 1.基本Base64编码 也就是完全按照标准Base64的映射规则来编解码,不添加任何行标。
2.Url Base64编码 JDK标准类库中的Url Base64编码是用"-"和"_"取代了"+"和"/"
3.MIME Base64编码 Java类库中还提供了一种格式更友好的Base64编码,这种编码输出每行不超过76字符,并且使用'\r'并跟随'\n'作为分割。
4.去除填充符的Base64 在Java标准类库中,还提供了一种方式来去除编码末尾的"=",就是在构建Encoder 对象后调用withoutPadding()方法,例如:
Commons Codec是Apache为Java开发者提供的一个开源软件类库,该类库中主要是一些常用的编码工具类包,例如DES、SHA1、MD5、Base64,URL等。在使用该类库之前需要首先在Eclipse中添加依赖。Commons Codec提供了以下Base64编码方式。 1.基本Base64编码 Commons Codec和Java标准类库提供给的Base64编码方式是一样的。
2.Url Base64编码 Url Base64编码和Java类库也是一样的,把"+"和"/"替换成了"-"和"_",有一个不同的地方是Commons Codec中的Url Base64默认去掉了后面的"=",相当于Java类库中调用了withouPadding方法,例如:
3.类MIME格式输出 Commons Codec中也提供了类似于Java类库中的MIME的格式化输出,在Commons Codec中有一个方法:
这里的isChunked置为true,就表示是按照MIME格式输出编码结果。
h
iOS Base64编码
Base64编码是一种数据编码方式,目的是让数据符合传输协议的要求。能够将任何二进制数据,转换成只有64 +1(“=”等号)个字符组成的文本文件。
提示:Base64不是加密算法,只是一种编码算法,对数据内容进行编码不以明文来传输。
标准Base64编码使用的64个字符:
早期的传输协议,如邮件传输SMTP协议,只能传输ASCII编码中 可打印字符 ,导致原本8bit字节码(0-255)超出了可用范围。所以Base64将原本ASCII码的控制字符甚至是ASCII编码之外的字符都转换成可打印的6bit字符。
提示:ASCII编码的范围是0-127,其中0-31和127位共33个字符属于 控制字符 ,剩下的32-126属于 可打印字符 。
编码过程: 1、按字符串长度,以每3个8bit的字符为一组 2、对每组获取每个字符的ASCII编码(去ASCII编码表找每个字符的码位) 3、将ASCII编码转换成8bit的二进制,得到一组3*8=24bit的字节 4、再将这24bit划分为4个6bit的字节,并在每个6bit的字节前面都填两个高位0,得到4个8bit的字节 5、将这4个8bit的字节转换成10进制,对照Base64编码表 (下表),得到对应编码后的字符。
注意:
示例:对 Hello! 进行Base64编码,按照ASCII表,其转换过程如下图所示:
Hello! 的Base64编码结果为 SGVsbG8h 。 原始字符串长度为6个字符,编码后长度为8个字符,每3个原始字符经Base64编码成4个字符,编码前后长度比4/3。 这个长度比很重要 。比原始字符串长度短,则需要使用更大的编码字符集,长度比越大,则需要传输越多的字符,传输时间越长。
注意:Base64编码是每3个原始字符编码成4个字符,如果原始字符串长度不能被3整除,那怎么办?使用0值来补充原始字符串。
示例:对 Hello!! 进行Base64编码:
注:图中蓝色背景的二进制0值是额外补充的。
Hello!! 的Base64编码的结果为 SGVsbG8hIQAA 。 最后2个零值只是为了Base64编码而补充的,在原始字符中并没有对应的字符,那么Base64编码结果中的最后两个字符 AA 实际不带有效信息,所以需要特殊处理,以免解码错误。 标准Base64编码通常用 = 字符来替换最后的 A,即编码结果为 SGVsbG8hIQ==。 因为 = 字符并不在Base64编码索引表中,其意义在于结束符号,在Base64解码时遇到 = 时即可知道一个Base64编码字符串结束。 如果Base64编码字符串不会相互拼接再传输,那么最后的 = 可以省略,解码时如果发现Base64编码字符串长度不能被4整除,则先补充 = 字符,再解码即可。 解码是对编码的逆向操作,但注意一点:对于最后的两个 = 字符,转换成两个 A 字符,再转成对应的两个6比特二进制0值,接着转成原始字符之前,需要将最后的两个6比特二进制0值丢弃,因为它们实际上不携带有效信息。
UTF-8是Unicode字符集的编码规则,用于网络传输。 Base64是用来支持某些只支持传输ASCII编码可打印字符的协议,将ASCII编码中的控制字符与ASCII之外的字符转换为ASCII可打印字符来用于传输。
漫画:什么是 Base64 算法? iOS开发探索-Base64编码 关于base64编码的原理及实现 ASCII码对照表
java:关于base64编码求解
首先base64是对字节码进行再次编码,所以要先把你这个字符转成二进行码(不过对于英文字母来说,转成的二进制码都是一样的,就没关系了)。'a'对应的二进制码为01000001(65),而base64是每6位编成一个字符(base64字符),则把此二进制码分成2段,第一段是010000,第二段是01(0000不足位补0),这两个不是一样的吗,值为16,对应第17个大写字母(0对应A),那自然是两个Q了,而base64编码至少编出4个字符(因为给3个字符来编码,一个6位,3个24位,6位一编码,正好编出4个,反过来自然是4个解码成3个)。另外这个编码过程本来就是它的原理,原理图如下,只要明白了原理才知道倒底怎么编。