Base64编码

独立博客文章链接: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


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值