?Python 2.7中的str是字節(jié)串走贪,而Python 3.x中的str是字符串
經(jīng)常聽到有人說“base64加密”允乐,其實base64并不能用于數(shù)據(jù)加密顶捷,它也不是為了純粹的數(shù)據(jù)加密而生的捕仔,它的出現(xiàn)是為了解決不可見字符串的網(wǎng)絡傳輸和數(shù)據(jù)保存問題喘鸟。因為键畴,用base64對數(shù)據(jù)進行轉(zhuǎn)換的過程不能成為“加密”與“解密”最盅,只能成為“編碼”與“解碼”突雪。
Base64是一種用64個字符來表示任意二進制數(shù)據(jù)的方法,它是一種通過查表對二進制數(shù)據(jù)進行編碼的方法涡贱,不能用于數(shù)據(jù)加密咏删。base64最初的出現(xiàn)時為了能夠正確的傳輸郵件數(shù)據(jù),因為郵件中的附件(比如圖片)的二進制數(shù)中可能存在不可見字符(ascii碼中128-255之間的值是不可見字符)问词,比如我們嘗試用記事本或其他文本編輯器打開一個圖片時督函,通常都會看到一大堆亂碼,這些亂碼就是不可見字符激挪。由于早期的一些網(wǎng)絡設(shè)備和網(wǎng)絡協(xié)議是無法正確識別這些字符的辰狡,這就可能在數(shù)據(jù)傳輸時出現(xiàn)各種無法預知的問題。base64的作用就是把含有不可見字符的信息用可見字符來表示(Ascii碼中0-127之間的值是可見字符)垄分,從而解決這個問題
Base64.encodeToString(str.getBytes())
它其實是使用 a-z, A-Z, 0-9, /宛篇, + 這64個字符來進行編碼的,0-63分別對應用前面的64個字符來表示薄湿。
其編碼結(jié)果的特點是:末尾可能有1個或者2個 = :
Pz8/aGVsbG8vc2FzZXdyZWRmZGQ+Pj4uIEhlbGxvIOS4lueVjO+8gQ==
其原因是叫倍,Base64編碼算法是每次處理byte[]數(shù)組中三個連續(xù)的byte,那么就有可能 byte[] 數(shù)組不是3的整數(shù)倍豺瘤,那么余數(shù)就有可能是1吆倦,或者2,所以就分別使用 一個 = 和兩個 = 來進行填充坐求。
所以:
Base64的編碼其特點就是可能末尾有一個或者兩個=蚕泽,可能含有 / 和 + 字符。
16進制編碼的特點是全部由'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' 這16個字符組成瞻赶,不含其他字母赛糟。
加密算法都是對byte[]進行變換和運算。
有 String 轉(zhuǎn)換得到的 byte[] 就一定可以使用原來的編碼方案轉(zhuǎn)換成原來的 String,
但是加密的結(jié)果 byte[] 卻不能用任何字符編碼方案得到String, 一般使用16進制編碼成String砸逊,然后進行存儲或者比較璧南。
base64.b64encode(s, altchars=None)對二進制數(shù)據(jù)(字節(jié)串)s通過base64進行編碼,返回編碼后的字節(jié)串
base64.b64decode(s, altchars=None, validate=False)對通過base64編碼的字節(jié)對象或ASCII字符串s進行解碼师逸,返回解碼后的字節(jié)串
base64.urlsafe_b64encode(s)與b64encode()函數(shù)不同的是司倚,它會把標準Base64編碼結(jié)果中的字符'+'和字符'/'分別替換成字符'-'和字符'_'。
base64.urlsafe_b64decode(s)解碼通過base64.urlsafe_b64encode()函數(shù)編碼的字節(jié)對象或ASCII字符串s篓像。
當判斷字符串是否是base64加密過的动知,或者要將字符串進行加密。
特別是爬蟲過程中员辩,js中經(jīng)常帶有base64進行加密解密的操作盒粮,只要知道整個邏輯,以后可以直接進行調(diào)用奠滑。
def jiemi_base64(): # 解密base64
? ? data = 'eyduYW1lJzona2trJywnYWdlJzoyMn0='
? ? # data= '''{'aa':'bb'}'''
? ? missing_padding = 4- len(data) %4
? ? if missing_padding:
? ? ? ? data += '=' * missing_padding
? ? print(base64.b64decode(data))
? ? print(type(base64.b64decode(data)))
? ? #b"{'name':'kkk','age':22}"
? ? #<class 'bytes'>
def jiami_base64(): # 加密base64
? ? data= "{'name':'kkk','age':22}"
? ? print(base64.b64encode(data.encode()))? # data必須是bytes類型丹皱,如果是字符串妒穴,則通過encode()轉(zhuǎn)換
? ? # b'eyduYW1lJzona2trJywnYWdlJzoyMn0='
if __name__ == '__main__':
? ? # jiami_base64()
? ? jiemi_base64()
由于‘z’后面bit位都是0,base64約定以‘=’代替
上述還可以寫為:
以24位摊崭,8位分割表示:
01111010 ? ? 00000000 ? ? 00000000
以24位讼油,6位分割表示:
011110 ? ?100000 ? ?000000 ? ?000000
6位如何以8位形式表示,在前面補0呢簸,即:
0001 1110 ? ?0010 0000 ? ?0000 0000 ? ?0000 0000
得到上述結(jié)果
因此矮台,‘z’經(jīng)過base64編碼得到:‘eg==’
用python驗證一下:
>>> base64.b64encode("z")
'eg=='
---------------------
作者:zhubaoJay
來源:CSDN
原文:https://blog.csdn.net/zhubaoJay/article/details/72957135
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接根时!