一文讀懂Base64編碼和MD5
Base64編碼
簡述
Base64是一種用64個字元來表示任意二進位制資料的方法。
Base64編碼可以成為密碼學的基石。可以將任意的二進位制資料進行Base64編碼。所有的資料都能被編碼為並只用65個字元就能表示的文字檔案。( 65字元:A~Z a~z 0~9 + / = )編碼後的資料~=編碼前資料的4/3,會大1/3左右。
Base64編碼的原理
[圖片上傳失敗...(image-456e10-1542450907355)]
- 將所有字元轉化為ASCII碼。
- 將ASCII碼轉化為8位二進位制 。
- 將二進位制3個歸成一組(不足3個在後邊補0)共24位,再拆分成4組,每組6位。
- 統一在6位二進位制前補兩個0湊足8位。
- 將補0後的二進位制轉為十進位制。
- 從Base64編碼表獲取十進位制對應的Base64編碼。
Base64編碼的說明
- 轉換的時候,將三個byte的資料,先後放入一個24bit的緩衝區中,先來的byte佔高位。
- 資料不足3byte的話,於緩衝區中剩下的bit用0補足。然後,每次取出6個bit,按照其值選擇查表選擇對應的字元作為編碼後的輸出。
- 不斷進行,直到全部輸入資料轉換完成。
- 如果最後剩下兩個輸入資料,在編碼結果後加1個“=”。
- 如果最後剩下一個輸入資料,編碼結果後加2個“=”。
- 如果沒有剩下任何資料,就什麼都不要加,這樣才可以保證資料還原的正確性。
Python的Base64使用
Python內建的base64
模組可以直接進行base64的編解碼
注意:用於base64編碼的,要麼是ASCII包含的字元,要麼是二進位制資料
In [1]: import base64 In [2]: base64.b64encode(b'hello world') Out[2]: b'aGVsbG8gd29ybGQ=' In [3]: base64.b64decode(b'aGVsbG8gd29ybGQ=') Out[3]: b'hello world'
MD5(資訊-摘要演算法)
簡述
message-digest algorithm 5(資訊-摘要演算法)。經常說的“MD5加密”,就是它→資訊-摘要演算法。
md5,其實就是一種演算法。可以將一個字串,或檔案,或壓縮包,執行md5後,就可以生成一個固定長度為128bit的串。這個串,基本上是唯一的。
不可逆性
每個人都有不同的指紋,看到這個人,可以得出他的指紋等資訊,並且唯一對應,但你只看一個指紋,是不可能看到或讀到這個人的長相或身份等資訊。
特點
- 壓縮性:任意長度的資料,算出的MD5值長度都是固定的。
- 容易計算:從原資料計算出MD5值很容易。
- 抗修改性:對原資料進行任何改動,哪怕只修改1個位元組,所得到的MD5值都有很大區別。
- 強抗碰撞:已知原資料和其MD5值,想找到一個具有相同MD5值的資料(即偽造資料)是非常困難的。
舉個栗子:世界上只有一個我,但是但是妞卻是非常非常多的,以一個有限的我對幾乎是無限的妞,所以可能能搞定非常多(100+)的妞,這個理論上的確是通的,可是實際情況下....
Python的MD5使用
由於MD5模組在python3中被移除,在python3中使用hashlib
模組進行md5操作
import hashlib # 待加密資訊 str = '這是一個測試' # 建立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) print('MD5加密後為 :' + hl.hexdigest())
執行結果
MD5加密前為 :這是一個測試 MD5加密後為 :cfca700b9e09cf664f3ae80733274d9f
MD5長度
md5的長度,預設為128bit,也就是128個0和1的二進位制串。這樣表達是很不友好的。所以將二進位制轉成了16進位制,每4個bit表示一個16進位制,所以128/4 = 32 換成16進製表示後,為32位了。
為什麼網上還有md5是16位的呢?
其實16位的長度,是從32位md5值來的。是將32位md5去掉前八位,去掉後八位得到的。
參考出處:ofollow,noindex">https://www.jianshu.com/p/4ba20afacce2