独立博客文章链接:http://zhuyanfeng.com/archives/119
这两天的工作需要以HTTP方式调用某厂商的彩信接口,其中彩信内容需要进行Base64编码,然后将其中的“+”号以“_”代替,将“=”以“%”代替。这是我第一次接触Base64编码,今天初步学习了一下,以完成工作为目标,并没有深入。以下内容整理自“百度百科”和“WiKiPedia”。
Base64简介
Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2的6次方等于64,所以每6个bit作为一个单元,对应某个可打印字符(如000000对应字母A、000001对象字母B)。在Base64中的可打印字符包括字母A-Z、a-z、数字0-9 ,这样共有62个字符,此外两个可打印符号在不同的系统中而不同。Base64索引表如:
三个字节有24个比特,对应于4个Base64单元,即3个字节需要用4个可打印字符来表示。例如采用Base64编码“Man”:
Base64在URL中的应用
Base64编码可用于在HTTP环境下传递较长的标识信息。例如,在Java持久化系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到。
但是标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式,而这些“%”号在存入数据库时还需要再进行转换,因为ANSI SQL中已将“%”号用作通配符。为解决此类问题,可采用一些用于URL的改进Base64编码,主要是对“+”等字符做一些替换。比如我现在做的工作中,通过HTTP调用某家厂商的彩信群发接口,其中彩信内容需要进行Base64编码,并将“+”替换为“_”,将“=”替换为“%”。
Base64还经常用于在下载软件中加密下载地址。以“迅雷”为例,很多下载类网站都提供“迅雷下载”的链接,其地址通常是经过加密的迅雷专用下载地址。如:
thunder://QUFodHRwOi8vd3d3LmJhaWR1LmNvbS9pbWcvc3NsbTFfbG9nby5naWZaWg==
其实迅雷的“专用地址”也是用Base64加密的,其加密过程如下:
一、在地址的前后分别添加AA和ZZ,如:
www.baidu.com/img/sslm1_logo.gif
变成
AAwww.baidu.com/img/sslm1_logo.gifZZ
二、对新的字符串进行Base64编码得到:
QUF3d3cuYmFpZHUuY29tL2ltZy9zc2xtMV9sb2dvLmdpZlpa
三、在上面得到的字符串前加上“thunder://”
就成了:
thunder://QUF3d3cuYmFpZHUuY29tL2ltZy9zc2xtMV9sb2dvLmdpZlpa
另:Flashget与迅雷类似,只不过在第一步时加的“料”不同罢了,Flashget加的是[FLASHGET],而QQ旋风的下载地址干脆不加料,直接就对地址进行Base64编码了。
Base64与MIME及Base64的其它用途
在MIME格式的电子邮件中,base64可以用来将binary的字节序列数据编码成ASCII字符序列构成的文本。使用时,在传输编码方式中指定base64。使用的字符包括大小写字母各26个,加上10个数字,和加号“+”,斜杠“/”,一共64个字符,等号“=”用来作为后缀用途。
(MIME:多用途互联网邮件扩展(MIME,Multipurpose Internet Mail Extensions)是一个互联网标准,它扩展了电子邮件标准,使其能够支持非ASCII字符、二进制格式附件等多种格式的邮件消息。)
下面是Base64的一些其它应用:
(1)Mozilla Thunderbird和Evolution用Base64来保密电子邮件密码
(2)Base64 也会经常用作一个简单的“加密”来保护某些数据,而真正的加密通常都比较繁琐。
(3)垃圾讯息传播者用Base64来避过反垃圾邮件工具,因为那些工具通常都不会翻译Base64的讯息。
(4)在LDIF档案,Base64用作编码字串。
Base64编解码的实现
对于Base64,自己用的不多,只是完成目前的彩信接口调用即可,没必要重新发明轮子。另外,在OpenSSL中有Base64编解码性能颇佳的成熟实现,不过OpenSSL自己也不熟,所以直接采用了一些网友的c/c++实现。(OpenSSL是一套开放源代码的SSL套件,其函数库由C语言实现,完成了基本的传输层数据加密功能。SSL是Secure Socket Layer(安全套接层协议)的缩写)。
下面贴出一些Base64编解码实现的源地址(感谢这些作者):
(1)http://www.adp-gmbh.ch/cpp/common/base64.html
(2)http://blog.csdn.net/medie/article/details/365400
(3)http://www.cnblogs.com/phinecos/archive/2008/10/10/1308272.html