什么是Base64编码?
按照RFC2045的定义,Base64的被定义为:Base64的内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。
为什么要使用Base64编码?
在设计这个编码的时候,我想设计人员最主要考虑了3个问题:
-
是否加密?
-
加密算法复杂程度和效率?
-
如何处理传输?
加密是肯定的,但是加密的目的不是让用户发送非常安全的Email。这种加密方式主要就是“防君子不防小人”。即达到一眼望去完全看不出内容即可。基于这个目的加密算法的复杂程度和效率也就不能太大和太低。和上一个理由类似,MIME协议等用于发送电子邮件的协议解决的是如何收发电子邮件,而并不是如何安全的收发电子邮件。因此算法的复杂程度要小,效率要高,否则因为发送电子邮件而大量占用资源,路就有点走歪了。
但是,如果是基于以上两点,那么我们使用最简单的恺撒法即可,为什么Base64编码看起来要比恺撒法复杂呢?这是因为在电子邮件的传送过程中,由于历史原因,现只被允许传送ASCII字符,即一个8位字节的低7位。因此,如果您发送了一封带有非ASCII字符(即字节的最高位是1)的电子邮件通过有“历史问题”的网关时就可能会出现问题。网关可能会把最高位置为0!很明显,问题就这样产生了!因此,为了能够正常的传送电子邮件,这个问题就必须考虑!所以,单单靠改变字母的位置的恺撒之类的方案也就不行了。关于这一点可以参考RFC2046。基于以上的一些主要原因产生了Base64编码。
参考邮件正文Content-Transfer-Encoding:base64
OpenSSL - Base64BASE64_ENCODE
(PHP 3,PHP 4,PHP 5)
base64_encode - 使用MIME base64对数据进行编码
说明
字符串base64_encode(字符串数据)
base64_encode()返回使用base64对数据进行编码。设计此种编码是为了使二进制数据可以通过非纯8位的传输层传输,例如电子邮件的主体。
Base64编码的数据要比原始数据多占用33%左右的空间。
例子1. base64_encode()示例
此示例将显示:
VGhpcyBpcyBhbiBlbmNvZGVkIHN0cmluZw ==
例子2. stream_filter_append()示例
编码:b64encode
此示例将显示:
'VGhpcyBpcyBhbiBlbmNvZGVkIHN0cmluZw =='
解码:
此示例将显示:
这是一个编码的字符串