我听过人们零散地谈论"base 64编码"。它通常用于什么?
该技术基本上是一种将任意二进制数据编码为ASCII文本的方法。每3个字节的数据需要4个字符进行编码,最后可能会有一些位填充。
实际上,输入的每6个比特被编码在一个64个字符的字母表中。 "标准" 字母表使用 A-Z、a-z、0-9,以及 + 和 /,= 作为填充字符。还有一些URL安全的变体。
维基百科 是一个相当好的获取更多信息的资源。
多年前,当邮件功能被引入时,它完全是基于文本的。随着时间的推移,像图片和媒体附件(音频、视频等)这样的需求出现了。当通过互联网发送这些附件时(基本上是以二进制数据的形式),原始二进制数据损坏的概率很高。因此,BASE64应运而生。
二进制数据的问题在于它包含空字符,在某些语言(如C、C++)中表示字符字符串的结尾,因此以原始形式发送包含NULL字节的二进制数据将停止文件被完全读取并导致数据损坏。
例如:
在C和C++中,“null”字符表示字符串的结尾。 因此,“HELLO”存储如下所示:
H E L L O
72 69 76 76 79 00
00 表示“到此为止”。
现在让我们深入了解BASE64编码的工作原理。
值得注意的一点:字符串长度应该是3的倍数。
例1:
要编码的字符串:“ace”,长度=3
a=97,c=99,e=101
97=01100001,99=01100011,101=01100101
综合:01100001 01100011 01100101
011000 010110 001101 100101
011000= 24, 010110= 22, 001101= 13, 100101= 37
24= Y, 22= W, 13= N, 37= l
“ace” => “YWNl”
示例2:
要编码的字符串:“abcd”,长度= 4,不是3的倍数。因此,为使字符串长度为3的倍数,我们必须添加2位填充以使长度= 6。填充位由“=”符号表示。
注意事项:一个填充位等于两个零00,因此两个填充位等于四个零0000。
因此,让我们开始这个过程:-
a = 97,b = 98,c = 99,d = 100
97= 01100001,98= 01100010,99= 01100011,100= 01100100
011000,010110,001001,100011,011001,00
因此,最后的6位不完整,所以我们插入两个填充位,它们等于四个零“0000”。
011000,010110,001001,100011,011001,000000 ==
现在,它是相等的。两个等号表示添加了4个零(有助于解码)。
011000= 24,010110= 22,001001= 9,100011= 35,011001= 25,000000=0 ==
24= Y,22= W,9= j,35= j,25= Z,0= A ==
"abcd" => "YWJjZA=="
Base-64 编码是一种将二进制数据转换为文本的方法,以便在电子邮件和 HTML 表单数据等传输中更容易传输。
这是一种将二进制数据转化为文本编码的方法,结果文本只包含字母、数字和符号“+”、“/”和“=”。它是一种方便的方式,用于在专门用于文本数据的介质上存储/传输二进制数据。
但是为什么选择Base-64呢?将二进制数据转换为文本的两个替代方法:
Base-64将3个字节(8 x 3 = 24位)映射到4个跨越6位(6 x 4 = 24位)的字符中。结果看起来像"TWFuIGlzIGRpc3Rpb..."。因此,膨胀仅为原始数据的 4/3 = 1.3333333 倍。
除了已经提到的内容,还有两个常见的用途没有被列出:
哈希:
哈希是一种单向函数,可以将一个字节块转换为另一个固定大小(如128位或256位(SHA/MD5))的字节块。将结果字节转换为Base64使得显示哈希更加容易,特别是在比较完整性校验和时。哈希在Base64中经常出现,因此许多人错误地将Base64本身视为哈希。
加密:
由于加密密钥不必是文本而是原始字节,因此有时需要将其存储在文件或数据库中,这时Base64就非常方便。对于所得到的加密字节也是一样。
请注意,尽管Base64经常用于加密,但它不是安全机制。任何人都可以将Base64字符串转换回其原始字节,因此不应将其用作保护数据的手段,只能用作以更轻松的方式显示或存储原始字节的格式。
证书
x509 PEM格式证书是以Base64编码的。http://how2ssl.com/articles/working_with_pem_files/
来自 http://zh.wikipedia.org/wiki/Base64
Base64是一种特定的MIME内容传输编码。它也用作一种通用术语,用于任何类似的编码方案,通过将二进制数据数值化并将其转换为基于64个字符的表示形式进行编码。选择特定的基数是由于字符集编码的历史原因:可以选择一组64个字符,这些字符既是大多数编码共同子集的一部分,也是可打印的。此组合使得数据在通过传统上不支持8位ASCII字符的系统(例如电子邮件)传输时不太可能被修改。
Base64可用于各种情境:
- Evolution和Thunderbird使用Base64来混淆电子邮件密码[1]
- Base64可用于传输和存储可能会导致分隔符冲突的文本
Base64经常用作快速但不安全的快捷方式来隐藏秘密,而不需要承担加密密钥管理的开销
垃圾邮件发送者使用Base64来逃避基本的反垃圾邮件工具,这些工具通常不会解码Base64,因此无法检测编码的邮件中的关键字。
- Base64用于在LDIF文件中对字符字符串进行编码
- Base64有时用于使用类似于......的语法将二进制数据嵌入XML文件中,例如Firefox的bookmarks.html。
- Base64还用于与政府财政签名打印设备(通常通过串行或并行端口)通信时,以最小化传输签名字符的延迟。
- Base64用于在脚本中编码二进制文件(如图像),以避免依赖外部文件。
- 可用于将原始图像数据嵌入CSS属性(例如background-image)中。
一些传输协议仅允许传输字母数字字符。想象一下使用控制字符来触发特殊操作和/或仅支持每个字符有限的比特宽度的情况。
Base64 将任何输入转换为一种编码,只使用字母数字字符、+
、/
和 =
作为填充字符。