什么是Base64编码?它的用途是什么?

1026

我听过人们零散地谈论"base 64编码"。它通常用于什么?


9
base64_encode() 的手册中得到的信息是:“这种编码方式旨在使二进制数据能够经过非 8 位清洁的传输层,例如邮件正文,而不被破坏。” - still_dreaming_1
19个回答

12
Base64是一种将二进制数据用ASCII字符串格式表示的文本编码方案。Base64旨在通过通道传输以二进制格式存储的数据。它可以采用任何形式的数据并将其转换为长字符串的纯文本形式。早期我们无法像文件那样传输大量数据,因为它由2⁸位字节组成,但我们实际的网络使用2⁷位字节。这就是Base64编码出现的地方。但是,Base64到底意味着什么?
让我们了解一下base64的含义。
Base64 = 基数(base) + 64
我们可以将base64称为基数64表示法。base64仅使用6位(2⁶=64个字符)来确保可打印数据是人类可读的。但是,如何做到的呢?我们也可以编写base65或base78,但为什么只有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的倍数,请用特殊字符i.e.=来补充,使其成为3的倍数。
3.以ASCII格式对字符串进行编码。
4.现在,它将把ASCII转换为8位二进制格式。
5.将二进制数据分成每个6位的块。
6.6位二进制数据块将转换为十进制数格式。
7.使用base64索引表,再次根据表格格式将十进制数转换为字符串。
8.最终,我们将得到输入字符串的编码版本。

11

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

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


11
"Base64编码方案通常用于需要编码二进制数据并存储和传输到只能处理文本数据的媒体上的情况。这是为了确保在传输过程中数据不被修改而保持完整性。(维基百科,2017)
例如,您有一个仅接受ASCII字符的Web服务。您想要保存并将用户数据传输到其他位置(API),但收件人希望接收未经修改的数据。这就是Base64发挥作用的地方......唯一的缺点是Base64编码将需要比常规字符串多约33%的空间。
另一个例子:uenc = url编码= aHR0cDovL2xvYy5tYWdlbnRvLmNvbS9hc2ljcy1tZW4tcy1nZWwta2F5YW5vLXhpaS5odG1s=http://loc.querytip.com/asics-men-s-gel-kayano-xii.html
正如您所看到的,如果我们想将最后访问的URL作为参数发送,我们无法在URL中放置“/”字符,因为我们会违反“MOD重写”-GET参数的属性/值规则。
一个完整的例子是:“http://loc.querytip.com/checkout/cart/add/uenc/http://loc.magento.com/asics-men-s-gel-kayano-xii.html/product/93/”"

8
我要描述的Base64使用方法有点像黑客技术。所以如果您不喜欢黑客技术,请不要继续阅读。
当我发现MySQL的utf8不支持4字节的unicode字符时,我遇到了麻烦,因为它使用的是3字节版本的utf8。那么我为了支持在MySQL的utf8上使用完整的4字节unicode做了什么呢?好吧,将字符串进行base64编码存储到数据库中,并在检索时进行base64解码。
由于base64编码和解码非常快速,上述方法完美运行。
您需要注意以下几点:
  • Base64编码会使用33%以上的存储空间

  • 存储在数据库中的字符串将无法被人类读取(您可以将其作为一种特性出售,即数据库字符串使用基本形式的加密)。

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

8
你可以将其作为一个特性出售,数据库字符串使用基本的加密形式。我喜欢你的风格:D - Ercan
12
你可以将此作为卖点,声称数据库字符串使用基本的加密形式。真是糟糕的说法 :D - Alex
4
对于任何没有 base64 解码算法的人来说,最基本的加密形式是使用 base64 编码。rofl :D - Eladian
2
@Alex 一点也不是“可怕的话”。二级敏感数据可以使用base64编码,使其无法被数据库管理员读取。并不是每个数据都需要最高级别的加密。例如,如果您想要隐藏“评论”不让数据库管理员看到,那么使用base64就足够了。谢谢! - Basil Musa
1
值得一提的是,MySQL现在已经支持Unicode的所有内容,尽管为了向后兼容性,他们的utf8类型仍然只有三个字节;如果你想要真正的东西,请使用utf8mb4。这是一个不错的技巧,但现在已经不再必要了。 - TRiG
显示剩余3条评论

8

我在实际应用中使用它来通过Web服务传输大型二进制对象(图像)。因此,在使用Python脚本测试C# Web服务时,可以通过一些小技巧重新创建二进制对象。

[在Python中]

import base64
imageAsBytes = base64.b64decode( dataFromWS )

1
数据传输速度更快了吗? - FelipeM
1
@FelipeM 慢一些,不要更快。Base64 有33%的开销(为了安全起见)。 - Juraj

6

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


4

稍微详细解释一下Brad的意思:许多电子邮件、Usenet和其他数据传输方式的传输机制并不是“8位清洁的”,这意味着标准ASCII字符集之外的字符在传输过程中可能会被破坏 - 例如,0x0D可能被视为回车符,并被转换为回车符和换行符。Base64将所有二进制字符映射到几个标准的ASCII字母、数字和标点符号中,以避免这种情况。


2

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

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

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

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

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


-1

Base64 可以用于许多目的。

主要原因是将二进制数据转换为可传递的内容。

我有时使用它来在不同网站之间传递 JSON 数据,在 cookie 中存储有关用户的信息。

注意: 您“可以”将其用于加密 - 我不明白为什么人们说您不能,而且这不是加密,尽管它很容易被破解并且不受欢迎。加密只意味着将一串数据转换为另一串可以稍后解密或不解密的数据,这就是 base64 所做的事情。


7
加密和编码的区别在于其目的和方法。加密是将明文转换为密文,以便只有授权方能够解密并读取原始数据。编码用于将数据从一种形式转换为另一种形式,而不考虑安全性。例如,将文本编码为ASCII码或将图像编码为JPEG格式。 - Hawkeye Parker
2
你太过于字面理解“加密”这个定义了。这个词已经演变成比其起源更为具体的东西了。 - Dan Bechard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接