Python(base64)编码模块

3/8/2017来源:ASP.NET技巧人气:1731

BASE64编码

         BASE64是一种编码方式,通常用于把二进制数据编码为可写的字符形式的数据。这是一种可逆的编码方式。Base64编码的作用:由于某些系统中只能使用ASCII字符。Base64就是用来将非ASCII字符的数据转换成ASCII字符的一种方法。而且base64特别适合在http,mime协议下快速传输数据。

         BASE64其实不是安全领域下的加密解密算法。虽然有时候经常看到所谓的base64加密解密。其实base64只能算是一个编码算法,对数据内容进行编码来适合传输。虽然base64编码过后原文也变成不能看到的字符格式,但是这种方式很初级,很简单。

        编码后的数据是一个字符串,其中包含的字符为:A-Z、a-z、0-9、+、/。共64个字符:26 + 26 + 10 + 1 + 1 = 64。【注:其实是65个字符,“=”是填充字符】。

64个字符需要6位来表示,表示成数值为0~63。

这样,长度为3个字节的数据经过Base64编码后就变为4个字节。

例:字符串“Xue”经过Base64编码后变为“WHVl”。

长度为3个字节的数据位数是8*3=24,可以精确地分成6*4。

如果数据的字节数不是3的倍数,则其位数就不是6的倍数,那么需要就不能精确地划分成6位的块。

此时,需在原数据后面添加1个或2个零值字节,使其字节数是3的倍数。

然后,在编码后的字符串后面添加1个或2个等号“=”,表示所添加的零值字节数。

例:字符串“Xu”经过Base64编码后变为“WHU=”。

字符串“X”经过Base64编码后变为“WA==”。

BASE64应用

需要明文保存二进制数据时,可以将不可打印的二进制数据经过Base64编码转成可打印的字符串。

Mozilla Thunderbird和Evolution用Base64来保密电子邮件密码Base64也会经常用作一个简单的“加密”来保护某些数据,而真正的加密通常都比较繁琐。垃圾讯息传播者用Base64来避过反垃圾邮件工具,因为那些工具通常都不会翻译Base64的讯息。在LDIF档案,Base64用作编码字串。

Python测试程序

#coding=utf-8
'''
Created on 2017年3月4日

@author: zxt
'''
import base64
import StringIO

# Python base64模块真正用的上的方法只有8个。
# 
# encode, decode一组, 专门用来编码和解码文件的, 也可以对StringIO里的数据做编解码;
# 
# encodestring, decodestring一组, 专门用来编码和解码字符串;
# 
# b64encode和b64decode一组,用来编码和解码字符串,并且有一个替换符号字符的功能。
# 这个功能是这样的: 因为base64编码后的字符除 了英文字母和数字外还有三个字符 + / =, 
# 其中=只是为了补全编码后的字符数为4的整数; 而+和/在一些情况下需要被替换的; b64encode和b64decode正是提供了这样的功能。
# 至于什么情况下+和/需要被替换,最常见的就是对url进行base64编码的时候。
# 
# urlsafe_b64encode和urlsafe_b64decode 一组, 这个就是用来专门对url进行base64编解码的,
# 实际上也是调用的前一组函数(b64encode和b64decode)。

str1 = "this is a test"
# 对字符串编码
encodeStrTest = base64.encodestring(str1)
PRint(encodeStrTest)
# 对字符串解码
print(base64.decodestring(encodeStrTest))

str2 = "Hello, World!"
strIO = StringIO.StringIO()
strIO.write(str2)
encodeTest = StringIO.StringIO()
decodeTest = StringIO.StringIO()
# 对StringIO内的数据进行编码
strIO.seek(0)
base64.encode(strIO, encodeTest)
print(encodeTest.getvalue())

# 对StringIO内的数据进行解码
encodeTest.seek(0)
base64.decode(encodeTest, decodeTest)
print(decodeTest.getvalue())

url = "http://www.cnblogs.com/sislcb/archive/2008/11/28/1342824.html"
# 对url的字符串进行编码
urlEncodeTest = base64.urlsafe_b64encode(url)
print(urlEncodeTest)
# 对url进行解码
print(base64.urlsafe_b64decode(urlEncodeTest))



# 上面的encode函数和decode函数的参数其实还可以是文件对象的,那的象这样:
# f1 = open('aaa.txt', 'r')
# f2 = open('bbb.txt', 'w')
# 
# base64.encode(f1, f2)
# 
# f1.close()
# f2.close()

Base64的不足之处

        标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式,而这些“%”号在存入数据库时还需要再进行转换,因为ANSI SQL中已将“%”号用作通配符。

        为解决此问题,可采用一种用于URL的改进Base64编码,它不在末尾填充'='号,并将标准Base64中的“+”和“/”分别改成了“-”和“_”,这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。