base 64编码用于什么?

时间:2008-10-14 14:50:52

标签: encoding base64 encode

我听说有人在这里和那里谈论“base 64编码”。它用于什么?

19 个答案:

答案 0 :(得分:835)

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

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

为什么选择64?
因为您通常可以依赖于许多字符集中存在的相同64个字符,并且您可以合理地确信您的数据最终会在电汇的另一端不受损坏。

答案 1 :(得分:190)

它基本上是一种用ASCII文本编码任意二进制数据的方法。每3字节数据需要4个字符,最后可能还有一些填充。

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

Wikipedia是提供更多信息的合理来源。

答案 2 :(得分:113)

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

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

答案 3 :(得分:109)

这是二进制数据的文本编码,其中结果文本只有字母,数字和符号“+”,“/”和“=”。这是通过专门用于文本数据的媒体存储/传输二进制数据的便捷方式。

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

  1. 十进制:将每个字节的十进制值存储为三个数字:045 112 101 037等,其中每个字节由3个字节表示。数据膨胀三倍。
  2. 十六进制:将字节存储为十六进制对:AC 47 0D 1A等,其中每个字节由2个字节表示。数据膨胀了两倍。
  3. Base-64以4个字符映射3个字节(8 x 3 = 24位),跨越6位(6 x 4 = 24位)。结果看起来像“TWFuIGlzIGRpc3Rpb ...”。因此,腹胀只是原来的4/3 = 1.3333333倍。

答案 4 :(得分:74)

除了已经说过的内容之外,尚未列出的两个非常常见的用途是

<强>散列:

哈希是单向函数,它将一个字节块转换为另一个固定大小的字节块,如128位或256位(SHA / MD5)。将结果字节转换为Base64使得显示哈希变得更加容易,尤其是在比较校验和的完整性时。在Base64中经常出现哈希,很多人将Base64本身误认为哈希。

<强>密码学:

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

请注意,虽然Base64经常用于加密,但它不是一种安全机制。任何人都可以将Base64字符串转换回其原始字节,因此不应将其用作保护数据的方法,仅作为显示或存储原始字节的格式。

<强>证书

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

答案 5 :(得分:25)

来自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。
  •   

答案 6 :(得分:22)

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

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

为了进一步扩展此系统,在定义ASCII字符集时,仅为00-7F分配了字符。 (今天仍然在80-FF范围内设置的所有字符都是非标准的)

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

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

答案 7 :(得分:11)

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

答案 8 :(得分:8)

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

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

由于base64编码和解码速度非常快,因此上述功能完美无缺。

您需要注意以下几点:

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

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

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

答案 9 :(得分:6)

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

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

答案 10 :(得分:6)

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

[在python中]

import base64
imageAsBytes = base64.b64decode( dataFromWS )

答案 11 :(得分:5)

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

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

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

正如你所知,如果我们想把最后访问过的URL作为参数发送,我们就不能在字符串中加上字符“/”,因为我们会破坏“MOD重写” - GET参数的属性/值规则。

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

答案 12 :(得分:4)

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

答案 13 :(得分:3)

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

答案 14 :(得分:2)

的Base64

Base64是许多类似编码方案的通用术语,它通过数字处理二进制数据并将其转换为基本64表示来编码二进制数据。 Base64术语源自特定的MIME内容传输编码。

当需要编码需要通过设计用于处理文本数据的媒体进行存储和传输的二进制数据时,通常使用Base64编码方案。这是为了确保数据在运输过程中保持完好无需修改。 Base64通常用于许多应用程序,包括通过MIME发送电子邮件,以及以XML格式存储复杂数据。

答案 15 :(得分:1)

几年前,当引入邮件功能时,它完全是基于文本的,随着时间的流逝,对图像和媒体(音频,视频等)附件的需求应运而生。当这些附件通过Internet发送时(基本上以二进制数据的形式),原始数据中二进制数据被破坏的可能性很高。因此,为解决此问题,BASE64出现了。

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

例如:

在C和C ++中,此“空”字符显示字符串的结尾。因此,“ HELLO”的存储方式如下:

H E L L O

72 69 76 76 79 00

00说“在这里停止”。

现在让我们深入研究BASE64编码的工作原理。

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

示例1:

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

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

a = 97,c = 99,e = 101

enter image description here

2)将每个十进制更改为8位二进制表示形式。

97 = 01100001,99 = 01100011,101 = 01100101

组合:01100001 01100011 01100101

3)分成一组6位。

011000 010110 001101 100101

4)计算二进制到十进制

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

5)使用base64图表将十进制字符隐藏为base64。

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

“ ace” =>“ YWNl”

enter image description here

示例2:

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

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

所以让我们开始这个过程:–

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

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

2)将每个十进制更改为8位二进制表示形式。

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

3)分成一组6位。

011000、010110、001001、100011、011001、00

最后6位不完整,因此我们插入了两个填充位,它们等于四个零“ 0000”。

011000、010110、001001、100011、011001、000000 ==

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

4)计算二进制到十进制。

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

5)使用base64图表将十进制字符隐藏为base64。

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

“ abcd” =>“ YWJjZA ==”

答案 16 :(得分:1)

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

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

每个Base64字符编码6位(最后一个非填充字符可以编码2、4或6位;最后一个填充字符(如果有)除外)。因此,对于每个Base64编码,一个128位的哈希至少需要⌈128/6⌉= 22个字符,如果有的话还要加上pad。

使用base64,我们可以生成所需长度(6、8或10)的编码输出。 如果我们选择确定8个字符长的输出,则它仅占用8个字节,而对于128位哈希输出则占用16个字节。

因此,除了安全性,还使用base64编码来减少占用的空间。

答案 17 :(得分:0)

Base64可用于多种用途。

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

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

注意: 你“可以”使用它进行加密 - 我不明白为什么人们说你不能,而且它不是加密,虽然它很容易破坏而且不受欢迎。加密只不过是将一个数据字符串转换为另一个数据字符串,以后可以解密,这就是base64的作用。

答案 18 :(得分:0)

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 位 using the ASCII table
  3. 转换为二进制格式后,将二进制数据分成 6 位块。
  4. 将 6 位二进制数据块转换为十进制数。
  5. 根据 base64 索引表将小数转换为字符串。 This table can be an example,但正如我所说,2 个特殊字符可能会有所不同。

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

举个例子:将字符串THS转换为base64编码的字符串。

  1. 算一下字符数:已经是3的倍数了。

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

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

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

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