什么是基地64编码用于?

我听到有人在这里和那里谈论“基础64编码”。 它是干什么用的?

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

所以为了解决这个问题,人们把二进制数据编码成字符。 Base64是这些types的编码之一。

为什么64?
因为通常可以依赖于许多字符集中存在的相同的64个字符,并且您可以有把握地确信,您的数据最终会在电线的另一端完好无损。

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

本质上,input的每个6位都以64个字母的字母表编码。 “标准”字母表使用AZ,az,0-9和+和/,with =作为填充字符。 有URL安全的变体。

维基百科是更多信息的合理来源。

Base-64编码是一种将二进制数据转换为文本的方式,使得它更容易通过电子邮件和HTML格式的数据进行传输。

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

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

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

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

Base-64映射3个字节(8 x 3 = 24位),采用6位(6 x 4 = 24位)的4个字符。 结果看起来像“TWFuIGlzIGRpc3Rpb …”。 所以腹胀只是原来的4/3 = 1.3333333倍。

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

哈希表:

哈希是单向函数,可将一个字节块转换为另一个固定大小的字节块,如128位或256位(SHA / MD5)。 将生成的字节转换为Base64使得显示哈希特别容易,特别是在比较校验和的完整性时。 哈希在Base64中经常被看到,许多人把Base64本身误认为哈希。

密码:

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

请注意,尽pipeBase64经常被用在密码学中,但并不是一种安全机制。 任何人都可以将Base64string转换回原来的字节,所以它不应该被用作保护数据的手段,而只是作为一种更容易显示或存储原始字节的格式。

证书

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

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

术语Base64是指特定的MIME内容传输编码。 它也被用作任何编码二进制数据的类似编码scheme的通用术语,通过对其进行数字处理并将其翻译成基本的表示。 基地的特定select是由于字符集编码的历史:人们可以select一组64个字符,这些字符既是大部分编码所共有的子集的一部分,也是可打印的。 这种组合使得数据不太可能在通过诸如电子邮件之类的系统中传输,而这些系统通常不是8位清洁的。

Base64可以用在各种环境中:

  • Evolution和Thunderbird使用Base64来模糊电子邮件密码[1]
  • Base64可以用来传输和存储可能导致定界符冲突的文本
  • Base64通常被用作快速但不安全的快捷方式来隐藏秘密,而不会导致encryption密钥pipe理的开销

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

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

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

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

为了进一步完善这个系统,当定义ASCII字符集时,只给00-7F分配字符。 (至今为止,所有在80-FF范围内设置的字符都是非标准的)

当天许多路由器将奇偶校验和字节转换为硬件,迫使附属于他们的计算机严格处理7位数据。 这强制将电子邮件附件(以及所有其他数据,这就是HTTP和SMTP协议基于文本的原因)转换为纯文本格式。

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

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

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

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

当我们通过Web服务传输大型的二进制对象(图像)时,我将其用在实际的意义上。 所以当我用python脚本testing一个C#web服务的时候,二进制对象可以用一个小魔术来重新创build。

[在Python中]

 import base64 imageAsBytes = base64.b64decode( dataFromWS ) 

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

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

由于base64编码和解码速度非常快,以上工作完美。

您有以下几点需要注意:

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

  • 存储在数据库中的string不会是人类可读的(您可以将其作为数据库string使用基本forms的encryption的function出售)。

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

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

为了扩大一下布拉德所说的话:许多电子邮件和Usenet的传输机制以及其他移动数据的方式都不是“8位清理”,这意味着标准ASCII字符集以外的字符可能会在运输过程中被破坏 – 例如, 0x0D可能被视为回车符,并变成回车符和换行符。 Base 64将所有的二进制字符映射成几个标准的ASCII字母,数字和标点符号,这样就不会被破坏。

Base64编码

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

Base64编码scheme通常用于需要对需要存储和传输的二进制数据进行编码以处理文本数据的介质。 这是为了确保数据在运输过程中保持完整无需修改。 Base64在许多应用程序中都经常使用,包括通过MIME发送电子邮件,以XML格式存储复杂的数据。

Base64可以用于很多目的。

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

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

注意:你“可以”用它来encryption – 我不明白为什么人们说你不能,而且这不是encryption,尽pipe它很容易被破坏,而且被人们所诟病。 encryption只不过是将一个数据串转换为另一个可以被解密的数据串,这就是base64所做的。

“Base64编码scheme通常用于需要对需要存储和传输的二进制数据进行编码的devise用于处理文本数据的介质。 这是为了确保数据在运输过程中保持不变而不被修改“(Wiki,2017)

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

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

正如你所看到的,如果我们想发送最后访问的URL作为参数,我们不能在URL中inputchar“/”,因为我们会打破“MOD rewrite” – GET参数的属性/值规则。

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