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?!咀ⅲ浩鋵嵤?5個字符,“=”是填充字符】。
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編碼轉成可打印的字符串。
Mozilla Thunderbird和Evolution用Base64來保密電子郵件密碼Base64也會經常用作一個簡單的“加密”來保護某些數據,而真正的加密通常都比較繁瑣。垃圾訊息傳播者用Base64來避過反垃圾郵件工具,因為那些工具通常都不會翻譯Base64的訊息。在LDIF檔案,Base64用作編碼字串。#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編解碼和數據庫存儲時所要作的轉換,避免了編碼信息長度在此過程中的增加,并統一了數據庫、表單等處對象標識符的格式。
新聞熱點
疑難解答