base 64编码用于什么?

我听到人们在这里和那里谈论“base 64编码”。它是用来做什么的?

483049 次浏览

Base-64编码是一种获取二进制数据并将其转换为文本的方法,以便更容易在电子邮件和超文本标记语言表单数据中传输。

http://en.wikipedia.org/wiki/Base64

大多数情况下,我看到它用于在只能处理ascii或简单字符集的上下文中编码二进制数据。

它用于将任意二进制数据转换为ASCII文本。

例如,电子邮件附件以这种方式发送。

它基本上是在ASCII文本中对任意二进制数据进行编码的一种方式。它每3个字节的数据需要4个字符,最后可能会加上一点填充。

基本上,输入的每6位都以64个字符的字母表编码。“标准”字母表使用A-Z、a-z、0-9以及+和/,并使用=作为填充字符。有URL安全的变体。

维基百科是一个相当好的更多信息来源。

某些传输协议只允许传输字母数字字符。想象一下控制字符用于触发特殊操作和/或仅支持每个字符的有限位宽的情况。base64将任何输入转换为仅使用字母数字字符、+/=作为填充字符的编码。

扩展一下Brad所说的:电子邮件和Usenet的许多传输机制以及其他移动数据的方式都不是“8位干净”,这意味着标准ascii字符集之外的字符可能会在传输过程中被损坏-例如,0x0D可能被视为回车,并变成回车和换行。Base 64将所有二进制字符映射为几个标准ascii字母、数字和标点符号,因此它们不会以这种方式损坏。

http://en.wikipedia.org/wiki/Base64

术语Base64是指特定的MIME内容传输编码。它也被用作任何类似编码方案的通用术语通过对二进制数据进行数值处理并将其转换为一个基数64表示。基数的特定选择是由于字符集编码历史:可以选择一组64既是大多数编码所共有的子集的一部分的字符,也可打印。这种组合使得数据不太可能修改通过系统传输,如电子邮件,这是传统上不是8位干净。

Base64可以在各种情况下使用:

  • Evolution和Thunderbird使用Base64来混淆电子邮件密码[1]
  • Base64可用于传输和存储可能导致分隔符冲突的文本
  • Base64通常用作快速但不安全的快捷方式来掩盖秘密,而不会产生加密密钥管理的开销

  • 垃圾邮件发送者使用Base64来逃避基本的反垃圾邮件工具,这些工具通常不会解码Base64,因此无法检测编码中的关键字消息。

  • Base64用于对LDIF文件中的字符串进行编码
  • Base64有时用于在XML文件中嵌入二进制数据,使用类似于……的语法。Firefox的bookmarks.html.
  • Base64还用于与政府财政签名打印设备(通常通过串行或并行端口)通信以最小化传输签名收据字符时的延迟。
  • Base64用于对脚本中的图像等二进制文件进行编码,以避免依赖外部文件。
  • 可用于将原始图像数据嵌入到CSS属性中,例如background-image。

当您有一些二进制数据要通过网络传送时,您通常不会通过以原始格式在网上流式传输位和字节来实现。为什么?因为有些媒体是为流式传输文本而制作的。你永远不知道-一些协议可能会将您的二进制数据解释为控制字符(如调制解调器),或者您的二进制数据可能会被搞砸,因为底层协议可能认为您输入了特殊的字符组合(如FTP如何转换行结尾)。

因此,为了解决这个问题,人们将二进制数据编码为字符。Base64是这些类型的编码之一。

为什么是64?
因为您通常可以依赖于许多字符集中存在的相同64个字符,并且您可以合理地确信您的数据将在未损坏的线路的另一边结束。

它是二进制数据的文本编码,生成的文本只有字母、数字和符号 "+", "/" 和“=”。这是一种通过专门用于文本数据的媒体存储/传输二进制数据的便捷方式。

但是为什么是Base-64呢?将二进制数据转换为立即浮现在脑海中的文本的两种选择是:

  1. 十进制:将每个字节的十进制值存储为三个数字:045 112 101 037等,其中每个字节由3个字节表示。数据膨胀了三倍。
  2. 十六进制:将字节存储为十六进制对:AC 47 0D 1A等,其中每个字节由2个字节表示。数据膨胀了两倍。

Base-64以4个字符映射3个字节(8 x 3=24位),跨越6位(6 x 4=24位)。结果看起来像“TWFuIGlzIGRpc3Rpb…”。因此,膨胀仅是原始的4/3=1.3333333倍。

在计算机的早期,当电话线系统间通信不是特别可靠时,使用一种快速而肮脏的验证数据完整性的方法:“位奇偶校验”。在这种方法中,传输的每个字节将有7位数据,第8位将是1或0,以强制字节中1位的总数为偶数。

因此0x01将被转换为0x81;0x02将是0x82;0x03将保持0x03等。

为了进一步发展这个系统,当定义ASCII字符集时,只分配了00-7F个字符。(直到今天,80-FF范围内的所有字符都是非标准的)

当今的许多路由器将奇偶校验和字节转换放入硬件中,迫使连接到它们的计算机严格处理7位数据。这迫使电子邮件附件(以及所有其他数据,这就是为什么HTTP和SMTP协议是基于文本的)转换为纯文本格式。

很少有路由器能存活到90年代。我严重怀疑它们中的任何一个今天都在使用。

当我们通过Web服务传输大型二进制对象(图像)时,我在实际意义上使用它。因此,当我使用python脚本测试C#Web服务时,可以用一点魔法重新创建二进制对象。

[在python中]

import base64imageAsBytes = base64.b64decode( dataFromWS )

除了已经说过的,还有两个非常常见的用途没有列出

哈希:

哈希是一种单向函数,它将一个字节块转换为另一个固定大小的字节块,例如128位或256位(SHA/MD5)。将生成的字节转换为Base64可以更轻松地显示哈希,尤其是在比较校验和以确定完整性时。哈希在Base64中经常看到,以至于许多人将Base64本身误认为是哈希。

密码学:

由于加密密钥不必是文本而是原始字节,因此有时需要将其存储在文件或数据库中,Base64对此很方便。与生成的加密字节相同。

请注意,尽管Base64经常用于密码学,但它不是一种安全机制。任何人都可以将Base64字符串转换回其原始字节,因此不应将其用作保护数据的手段,而应将其用作更容易显示或存储原始字节的格式。

证书

PEM格式的x509证书是base 64编码的。http://how2ssl.com/articles/working_with_pem_files/

Base64可以用于许多目的。

主要原因是将二进制数据转换为可通过的数据。

我有时用它来将JSON数据从一个站点传递到另一个站点,存储信息关于用户的cookie。

备注:你“可以”使用它进行加密——我不明白为什么人们说你不能,而且它不是加密,尽管它很容易被破解并且不被认可。加密只不过意味着将一串数据转换为另一串数据,这些数据可以稍后解密或不解密,这就是base 64所做的。

我要在这里描述的Base64的用法有点像黑客。所以如果你不喜欢黑客,请不要继续。

当我发现MySQL的utf8不支持4字节的Unicode字符时,我遇到了麻烦,因为它使用的是utf8的3字节版本。那么,我做了什么来支持MySQL的utf8上的完整4字节Unicode呢?好吧,在存储到数据库时对字符串进行Bas64编码,在检索时进行Bas64解码。

由于base 64编码和解码速度非常快,因此上述操作非常完美。

您需要注意以下几点:

  • Base64编码使用33%的存储空间

  • 存储在数据库中的字符串不会是人类可读的(您可以将其作为数据库字符串使用基本加密形式的功能出售)。

您可以将上述方法用于任何不支持Unicode的存储引擎。

“当需要对需要通过旨在处理文本数据的媒体存储和传输的二进制数据进行编码时,通常使用Base64编码方案。这是为了确保数据在传输过程中保持完整而不被修改”(Wiki,2017)

例如:您有一个只接受ASCII字符的Web服务。您想保存然后将用户的数据传输到其他位置(API),但收件人希望接收未触及的数据。Base64就是这样…唯一的缺点是bas64编码比常规字符串需要大约33%的空间。

另一个例子e:: uenc=url编码=aHR0cDovL2xvYy5tYWdlbnRvLmNvbS9hc2ljcy1tZW4tcy1nZWwta2F5YW5vLXhpaS5odG1s=http://loc.querytip.com/asics-men-s-gel-kayano-xii.html

如您所见,如果我们想将上次访问的URL作为参数发送,我们不能将char“/”放在URL中,因为我们会破坏“MOD重写”-GET参数的属性/值规则。

一个完整的例子是:“http://loc.querytip.com/checkout/cart/add/uenc/http://loc.magento.com/asics-men-s-gel-kayano-xii.html/product/93/

几年前,当邮件功能被引入时,那是完全基于文本的,随着时间的推移,对图像和媒体(音频,视频等)等附件的需求出现了。当这些附件通过互联网发送时(基本上是以二进制数据的形式),二进制数据原始形式损坏的可能性很高。因此,为了解决这个问题,BASE 64出现了。

二进制数据的问题是它包含空字符,在C等某些语言中,C++表示字符串的结尾,因此以包含NULL字节的原始形式发送二进制数据将阻止文件被完全读取并导致损坏的数据。

例如:

在C和C++中,这个“空”字符显示字符串的结尾。所以“HELLO”是这样存储的:

H E L L O

72 69 76 76 79 00

00说“停在这里”。

现在让我们深入了解BASE 64编码的工作原理。

需要注意的一点:字符串的长度应该是3的倍数。

示例1:

要编码的字符串:“ace”,长度=3

  1. 将每个字符转换为十进制。

a=97, c=99, e=101

在此处输入图片描述

  1. 将每个十进制更改为8位二进制表示。

97=01100001,99=01100011,101=01100101

组合:01100001 01100011 01100101

  1. 在一组6位中分开。

011000 010110 001101 100101

  1. 计算二进制到十进制

011000=24,010110=22,001101=13,100101=37

  1. 隐蔽的十进制字符使用base 64图表。

24=Y,22=W,13=N,37=l

"ace"=>"YWNl"

在此处输入图片描述

示例2:

要编码的字符串:“abcd”长度=4,不是3的倍数。因此要使字符串长度倍数为3,我们必须添加2位填充以使长度=6。填充位由“=”符号表示。

需要注意的一点:一个填充位等于两个零00,所以两个填充位等于四个零0000。

让我们开始这个过程:-

  1. 将每个字符转换为十进制。

a=97, b=98, c=99, d=100

  1. 将每个十进制更改为8位二进制表示。

97=01100001,98=01100010,99=01100011,100=01100100

  1. 在一组6位中分开。

011000,010110,001001,100011,011001,00

所以最后一个6位是不完整的,所以我们插入两个填充位,等于四个零“0000”。

011000,010110,001001,100011,011001,000000==

现在,它是相等的。结尾处的两个等号表示添加了4个零(有助于解码)。

  1. 计算二进制到十进制。

011000=24,010110=22,001001=9,100011=35,011001=25,000000=0==

  1. 隐蔽的十进制字符使用base 64图表。

24=Y,22=W,9=j,35=j,25=Z,0=A==

"abcd"=>"YWJjZA=="

一个十六进制数字是一个半字节(4位)。两个半字节构成8位,也称为1字节。

MD5生成一个128位输出,该输出使用32个十六进制数字序列表示,这些数字依次为32*4=128位。128位构成16个字节(因为1字节是8位)。

每个Base64字符编码6位(最后一个非垫字符除外,它可以编码2、4或6位;和最终的垫字符,如果有的话)。因此,按照Base64编码,128位哈希至少需要128/6=22个字符,加上垫(如果有)。

使用bas64,我们可以生成所需长度(6、8或10)的编码输出。如果我们选择8 char long输出,它只占用8个字节,而128位哈希输出占用16个字节。

因此,除了安全性之外,Base64编码还用于减少空间消耗。

base64二进制到文本编码方案,表示ASCII字符串格式的二进制数据。它旨在通过网络通道携带以二进制格式存储的数据。

Base64机制使用64个字符进行编码。这些字符包括:

  1. 10数值:即0,1,2,3,…,9
  2. 26个大写字母:即A、B、C、D、…、Z
  3. 26小写字母:a、b、c、d、…、z
  4. 2个特殊字符(这些字符取决于操作系统):即+、/

Base64如何工作

使用Base64算法编码字符串的步骤如下:

  1. 计算字符串中的字符数。如果不是3的倍数,则用特殊字符(即=)填充它以使其成为3的倍数。
  2. 将字符串转换为ASCII二进制格式8位使用ASCII表
  3. 转换为二进制格式后,将二进制数据分成6位的块。
  4. 将6位二进制数据块转换为十进制数。
  5. 根据bas64索引表将小数转换为字符串。这张桌子可以作为一个例子,但正如我所说,2个特殊字符可能会有所不同。

现在,我们得到了输入字符串的编码版本。

让我们做一个例子:将字符串THS转换为bas64编码字符串。

  1. 计算字符数:它已经是3的倍数。

  2. 转换为ASCII二进制格式8位。我们得到(T)01010100(H)01001000(S)01010011

  3. 将二进制数据分成6位的块。我们得到了010101 000100 100001 010011

  4. 将6位二进制数据块转换为十进制数。我们得到了21 4 33 19

  5. 根据bas64索引表将小数转换为字符串。我们得到了VEh T

bas64是一种二进制到文本编码方案,表示ASCII字符串格式的二进制数据。base 64旨在跨通道传输以二进制格式存储的数据。它接受任何形式的数据并将其转换为一长串纯文本。早些时候,我们不能像文件一样传输大量数据,因为它由2位字节组成,但我们的实际网络使用2位字节。这就是base 64编码的原因。但是,base 64实际上是什么意思?

让我们来理解Base64的含义。

bas64=base+64

我们可以将Bas64称为基数64representation.base64仅使用6位(2=64个字符)来确保可打印数据是人类可读的。但是,怎么做?我们也可以编写Bas65或Bas78,但是为什么只有64?让我们证明一下。Base64编码包含64个字符来编码任何字符串。Base64包含:

10个数值即0,1,2,3,……9。

26个大写字母,即A、B、C、D、…… Z。

26小写字母,即a、b、c、d、…… z。

两个特殊字符即., +,/. 取决于您的操作系统。

Base64算法所遵循的步骤如下:

  1. 计算字符串中的字符数。
  2. 如果不是3的倍数,则使用特殊字符垫,即=to取3的倍数
  3. 将字符串编码为ASCII格式。
  4. 现在,它将ASCII转换为二进制格式,每个8位。
  5. 转换为二进制格式后,它会将二进制数据划分为每个6位的块。
  6. 6位二进制数据块现在将转换为十进制数字格式。
  7. 使用bas64索引表,小数将再次转换根据表格式转换为字符串。
  8. 最后,我们将获得输入字符串的编码版本。