首页 > 编程 > Python > 正文

Python(base64)编码模块

2019-11-06 07:19:50
字体:
来源:转载
供稿:网友

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 base64import 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编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表