Python 中的url,Base64和MD5编码解码的使用
1.encode()和decode()
我們所說的加密方式,都是對二進制編碼的格式進行加密的,對應到Python中,則是我們的Bytes(字節)。
所以當我們在Python中進行加密操作的時候,要確保我們操作的是Bytes,否則就會報錯。
將字符串和Bytes互相轉換可以使用encode()和decode()方法。
如下所示:
運行結果:
b'\xe8\xa7\xa3\xe9\x99\xa4\xe9\x9a\x94\xe7\xa6\xbb\xe5\x90\xa7\xef\xbc\x81\xe4\xb8\x8a\xe5\xb8\x9d' 解除隔離吧!上帝2.binascii模塊
binascii模塊主要用于二進制和ASCII互相轉換(Convert between binary and ASCII ),在編碼和解碼領域通常將十六進制顯示的字節轉換成我們在加解密中更常用的顯示方式。
常用的方法:
| b2a_hex(data) | 將二進制數據轉換成16進制的表現形式 |
| a2b_hex(data) | 將16進制的格式數據轉換成二進制形式 |
| a2b_base64(string) | 將base64的數據轉換為二進制數據,并返回該二進制數據 |
| b2a_base64(string) | 將二進制數據轉換成base64格式的數據 |
更詳細可以參考博客:Python binascii模塊
代碼演示:
import binasciistr_encode = "解除隔離吧!上帝".encode("utf-8") bin_hex = binascii.b2a_hex(str_encode) print("bin_hex :", bin_hex)a2b_hex = binascii.a2b_hex(bin_hex) print("a2b_hex:", a2b_hex)v = binascii.a2b_hex(bin_hex).decode("utf-8") print(v) b = str_encode.decode("utf-8") print(b)測試結果:
bin_hex : b'e8a7a3e999a4e99a94e7a6bbe590a7efbc81e4b88ae5b89d' a2b_hex: b'\xe8\xa7\xa3\xe9\x99\xa4\xe9\x9a\x94\xe7\xa6\xbb\xe5\x90\xa7\xef\xbc\x81\xe4\xb8\x8a\xe5\xb8\x9d' 解除隔離吧!上帝 解除隔離吧!上帝3.URL編碼
3.1 簡介
正常的URL中是只能包含ASCII字符的,也就是字符、數字和一些符號。而URL編碼就是一種瀏覽器用來避免url中出現特殊字符(如漢字)的編碼方式。其實就是將超出ASCII范圍的字符轉換成帶%的十六進制格式。
3.2 URL為何要編碼、解碼
通常如果一樣東西需要編碼,說明這樣東西并不適合傳輸。原因多種多樣,如Size過大,包含隱私數據。對于Url來說,之所以要進行編碼,是因為Url中有些字符會引起歧義。
例如,Url參數字符串中使用key=value鍵值對這樣的形式來傳參,鍵值對之間以&符號分隔,如/s?q=abc&ie=utf-8。如果你的value字符串中包含了=或者&,那么勢必會造成接收Url的服務器解析錯誤,因此必須將引起歧義的&和=符號進行轉義,也就是對其進行編碼。
又如,Url的編碼格式采用的是ASCII碼,而不是Unicode,這也就是說你不能在Url中包含任何非ASCII字符,例如中文。否則如果客戶端瀏覽器和服務端瀏覽器支持的字符集不同的情況下,中文可能會造成問題。
| urllib.quote(url) | 對url進行編碼 |
| urllib.unquote(deurl) | 對已經url編碼的解碼 |
代碼演示:
from urllib import parsea = parse.quote("趕緊解封吧!") print(a) b = parse.unquote(a) print(b)運行結果:
%E8%B5%B6%E7%B4%A7%E8%A7%A3%E5%B0%81%E5%90%A7%EF%BC%81 趕緊解封吧!4.Base64編碼
4.1簡介
Base64是一種用64個字符來表示任意二進制數據的方法。
Base64編碼可以成為密碼學的基石。可以將任意的二進制數據進行Base64編碼。所有的數據都能被編碼為并只用65個字符就能表示的文本文件。( 65字符:A~Z a~z 0~9 + / = )編碼后的數據~=編碼前數據的4/3,會大1/3左右。
4.2 Base64編碼的原理
- 將所有字符轉化為ASCII碼。
- 將ASCII碼轉化為8位二進制 。
- 將二進制3個歸成一組(不足3個在后邊補0)共24位,再拆分成4組,每組6位。
- 統一在6位二進制前補兩個0湊足8位。
- 將補0后的二進制轉為十進制。
- 從Base64編碼表獲取十進制對應的Base64編碼。
4.3 Base64編碼的說明
- 轉換的時候,將三個byte的數據,先后放入一個24bit的緩沖區中,先來的byte占高位。
- 數據不足3byte的話,于緩沖區中剩下的bit用0補足。然后,每次取出6個bit,按照其值選擇查表選擇對應的字符作為編碼后的輸出。
- 不斷進行,直到全部輸入數據轉換完成。
- 如果最后剩下兩個輸入數據,在編碼結果后加1個“=”。
- 如果最后剩下一個輸入數據,編碼結果后加2個“=”。
- 如果沒有剩下任何數據,就什么都不要加,這樣才可以保證資料還原的正確性。
4.4 Python的Base64使用
Python內置的base64模塊可以直接進行base64的編解碼
注意:用于base64編碼的,要么是ASCII包含的字符,要么是二進制數據
輸出:
b'6LW257Sn6Kej5bCB5ZCn77yB' 趕緊解封吧!5.MD5(信息-摘要算法)
5.1 簡述
message-digest algorithm 5(信息-摘要算法)。經常說的“MD5加密”,就是它→信息-摘要算法。
md5,其實就是一種算法。可以將一個字符串,或文件,或壓縮包,執行md5后,就可以生成一個固定長度為128bit的串。這個串,基本上是唯一的。
5.2 不可逆性
每個人都有不同的指紋,看到這個人,可以得出他的指紋等信息,并且唯一對應,但你只看一個指紋,是不可能看到或讀到這個人的長相或身份等信息。
5.3 特點
- 壓縮性:任意長度的數據,算出的MD5值長度都是固定的。
- 容易計算:從原數據計算出MD5值很容易。
- 抗修改性:對原數據進行任何改動,哪怕只修改1個字節,所得到的MD5值都有很大區別。
- 強抗碰撞:已知原數據和其MD5值,想找到一個具有相同MD5值的數據(即偽造數據)是非常困難的。
5.4 Python的MD5使用
import hashlib# 待加密信息 str = '趕緊解封吧!' # 創建md5對象, # md5對象,md5不能反解,但是加密是固定的,就是關系是一一對應,所以有缺陷,可以被對撞出來 hl = hashlib.md5() # 要對哪個字符串進行加密,就放這里 # 此處必須聲明encode # 若寫法為hl.update(str) 報錯為: Unicode-objects must be encoded before hashing hl.update(str.encode(encoding='utf-8'))print('MD5加密前為 :' + str) # hl.hexdigest()) # 拿到加密字符串 print('MD5加密后為 :' + hl.hexdigest())hash3 = hashlib.md5(bytes('abd', encoding='utf-8')) ''' 如果沒有參數,所以md5遵守一個規則,生成同一個對應關系,如果加了參數, 就是在原先加密的基礎上再加密一層,這樣的話參數只有自己知道,防止被撞庫, 因為別人永遠拿不到這個參數 ''' hash3.update(bytes("admin", encoding="utf-8")) print(hash3.hexdigest()) # 9aea3c0a6c51555c1a4d0a5e9b689ded運行結果:
MD5加密前為 :趕緊解封吧! MD5加密后為 :3d2d2e10bcd07a1d5d94a7d35c0b7c79 9aea3c0a6c51555c1a4d0a5e9b689dedMD5不僅僅是上面這個例子這樣用來處理字符串,還有更廣泛的用途:
- 加密網站注冊用戶的密碼。
- 網站用戶上傳圖片 / 文件后,計算出MD5值作為文件名。(MD5可以保證唯一性)
- key-value數據庫中使用MD5值作為key。
- 比較兩個文件是否相同。(大家在下載一些資源的時候,就會發現網站提供了MD5值,就是用來檢測文件是否被篡改)
5.5 MD5長度
md5的長度,默認為128bit,也就是128個0和1的二進制串。這樣表達是很不友好的。所以將二進制轉成了16進制,每4個bit表示一個16進制,所以128/4 = 32 換成16進制表示后,為32位了。
為什么網上還有md5是16位的呢?
其實16位的長度,是從32位md5值來的。是將32位md5去掉前八位,去掉后八位得到的。
總結
以上是生活随笔為你收集整理的Python 中的url,Base64和MD5编码解码的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 下载拉钩教育AES加密视频
- 下一篇: python获取cookies