您現在的位置是:首頁 > 手機遊戲首頁手機遊戲
Python之Base64加解密
- 2022-01-10
解碼模組上的字母代表什麼意思
1、什麼是Base64
Base64是一種基於64個可列印字元來表示二進位制資料的表示方法。由於2^6=64,所以每6個位元為一個單元,對應某個可列印字元。
3個位元組有24個位元,對應於4個Base64單元,即3個位元組可由4個可列印字元來表示。在Base64中的可列印字元包括字母A-Z、a-z、數字0-9,這樣共有62個字元,此外兩個可列印符號在不同的系統中而不同。
Base64模組真正用得上的方法只有8個,分別是:
encode, decode, encodestring, decodestring, b64encode, b64decode, urlsafe_b64decode, urlsafe_b64encode。
它們8個可以兩兩分為4組:
encode,decode一組,專門用來編碼和解碼檔案的, 也可以對StringIO裡的資料做編解碼;
encodestring,decodestring一組,專門用來編碼和解碼字串;
b64encode,b64decode一組,用來編碼和解碼字串,並且有一個替換符號字元的功能。
這個功能是這樣的:因為Base64編碼後的字元除了英文字母和數字外還有三個字元‘ + / =’,其中‘=’只是為了補全編碼後的字元數為4的整數,而‘+’和‘/’在一些情況下需要被替換的,b64encode和b64decode正是提供了這樣的功能。至於什麼情況下‘+’和‘/’需要被替換,最常見的就是對url進行Base64編碼的時候。
urlsafe_b64encode,urlsafe_b64decode 一組,這個就是用來專門對url進行Base64編解碼的,實際上也是呼叫的前一組函式。
2、Base64有什麼使用場景
Base64是一種任意二進位制到文字字串的編碼方法,常用於在URL、Cookie、網頁中傳輸少量二進位制資料,包括MIME的電子郵件及XML的一些複雜資料。
3、base64轉換過程
如下圖所示:
Python標準庫中提供了base64模組,用來進行轉換,因使用到以下二組方法,故做如下說明:
base64.b64encode()將bytes型別資料進行base64編碼,返回編碼後的bytes型別
base64.b64deocde()將base64編碼的bytes型別進行解碼,返回解碼後的bytes型別
decode的作用是將其他編碼的字串轉換成unicode編碼
encode的作用是將unicode編碼轉換成其他編碼的字串
4、工作中遇到的問題
使用curl 命令可以正常地返回,如下:
tony@l-l-server1。beta。op。tx1 ~ $ curl “http://10。7。37。9:9200/entity-prod-ars_ars-profile/_count?pretty” -u‘ars_es_rw:LohZUiU9CIqh1oe4VP’{“count” : 61475690,“_shards” : {“total” : 5,“successful” : 5,“skipped” : 0,“failed” : 0}}
轉換為Python的request請求時一直失敗。如下圖所示:
正確的處理應該是這樣的:
def get_es_token(): username=“ars_es_rw” password=“LohZUiU9CIqh1oe4VP” token=base64。b64encode(“{}:{}”。format(username, password)。encode()) headers = {‘content-type’: ‘application/json’,“Authorization”:“Basic ” + bytes。decode(token)} print(headers) url=“http://10。7。37。9:9200/entity-prod-ars_ars-profile/_count?pretty” response = requests。request(“POST”, url, headers=headers) print(response。text)
備註:上面截圖失敗與下面成功的原因在於要使用bytes。decode方法將token bytes型別轉換為str。 或寫成:str(token,encoding=’utf8’)都可以。
簡單解釋下bytes是什麼:
bytes 只負責以位元組序列的形式(二進位制形式)來儲存資料,至於這些資料到底表示什麼內容(字串、數字、圖片、音訊等),完全由程式的解析方式決定。如果採用合適的字元編碼方式(字符集),位元組串可以恢復成字串;反之亦然,字串也可以轉換成位元組串。
以下是網上查的示例:
# bytes objectb = b“example”# str objects = “example”# str to bytessb = bytes(s, encoding = “utf8”)# bytes to strbs = str(b, encoding = “utf8”)# an alternative method# str to bytessb2 = str。encode(s)# bytes to strbs2 = bytes。decode(b)
5、小技巧
可以看一下在Linux下的加密與解密字串:
tony@l-l-server1。beta。op。tx1 ~ $ echo “ars_es_rw:LohZUiU9CIqh1oe4VP” | base64 YXJzX2VzX3J3OkxvaFpVaVU5Q0lxaDFvZTRWUAo= tony@l-l-server1。beta。op。tx1 ~ $ echo “YXJzX2VzX3J3OkxvaFpVaVU5Q0lxaDFvZTRWUA==” | base64 -dars_es_rw:LohZUiU9CIqh1oe4VP