Python學習——hashlib模組
一、概述
在程式開發過程中,很多時候會涉及使用者資訊驗證環節,這類場景下我們往往需要對字串進行加密處理。python中也有專門的加密模組,它就是hashlib。下面章節將詳述它的常見用法。
二、常見加密演算法的使用
hashlib模組支援業界主流常見的一些加密演算法,如md5,sha1,sha256,sha384,sha 512,hmac加密等,具體用法都差不多,只是呼叫的演算法不同而已。需要注意的是,在輸入需要被加密的字串時,必須先encode等二進位制串,所以在字串前面要加上b。
2.1 md5加密
直接上程式碼把,沒有太多可以講述的了。
import hashlib
m = hashlib.md5() #建立一個md5物件,即通過md5加密處理
m.update(b'python') #此處傳遞的字串需要encode成二進位制,前面加b
print(m.hexdigest()) #以16進位制輸出
輸出:
23eeeb4347bdd26bfc6b7ee9a3b755dd
注意:
這裡的update有點類似於append的作用,當我們連續兩次update後輸出時,最後輸出的md5碼並非最後一次update的字串對應的md5碼,而是對此前所有update的字串的拼接後計算出的md5碼,當然前提是update前面的物件是同一個。
如何驗證這個結論呢?程式碼奉上:
import hashlib
m = hashlib.md5()
m.update(b'py')
print(m.hexdigest())
m.update(b'thon')
print(m.hexdigest())
print('-------' )
n = hashlib.md5()
n.update(b'python')#一次性update一個字串
print(n.hexdigest())
print('========')
o = hashlib.md5()
o.update(b'py'+b'thon')#自行拼接字串輸出
print(o.hexdigest())
輸出:
dfed5bc177b87ab317c584e06566adc6
23eeeb4347bdd26bfc6b7ee9a3b755dd
-------
23eeeb4347bdd26bfc6b7ee9a3b755dd
========
23eeeb4347bdd26bfc6b7ee9a3b755dd
從以上程式碼可以看出,對同一個md5物件多次update字串,輸出的md5碼實際是對多個字串拼接後的md5計算。這裡也給我們一個啟示,如果要計算一個檔案的md5碼,如果檔案長度不會對機器的硬體資源造成壓力,一次性讀取內容後進行md5計算是最快捷的方式了。
2.2 sha1加密
如上文所述,其他演算法的用法非常類似,只是呼叫的演算法不同罷了。
import hashlib
m = hashlib.sha1()
m.update(b'sha1')
print(m.hexdigest())
輸出:
415ab40ae9b7cc4e66d6769cb2c08106e8293b48
2.3 sha256加密
如法炮製sha256演算法。
import hashlib
m = hashlib.sha256()
m.update(b'sha1')
print(m.hexdigest())
輸出:
b1565820a5cdac40e0520d23f9d0b1497f240ddc51d72eac6423d97d952d444f
2.4 sha512加密
看看sha512演算法把。
import hashlib
m = hashlib.sha512()
m.update(b'sha1')
print(m.hexdigest())
輸出:
4af46fa0152c825afee230022f46e3aedb0a9ee2a3dc20e30821a4d263327074b26455f29578812876011dd921132c6ed813b38d16b1b2a1c1fa7cea1a6b1fd9
2.5 hmac加密
以上加密演算法主要用於字串的加密處理,還有一種用於身份驗證可防竊聽的加密演算法,它就是hmac加密。雜湊訊息鑑別碼,簡稱HMAC,是一種基於訊息鑑別碼MAC(Message Authentication Code)的鑑別機制,是一種基於金鑰的雜湊演算法的認證協議。
HMAC加密演算法是一種基於金鑰的報文完整性的驗證方法,其安全性是建立在Hash加密演算法基礎上的。它要求通訊雙方共享金鑰、約定演算法、對報文進行Hash運算,形成固定長度的認證碼。通訊雙方通過認證碼的校驗來確定報文的合法性。HMAC加密演算法可以用來作加密、數字簽名、報文驗證等。
HMAC加密演算法的定義
HMAC加密演算法是一種執行“校驗和”的演算法,它通過對資料進行“求和”來檢查資料是否被更改了。在傳送資料以前,HMAC加密演算法對資料塊和雙方約定的公鑰進行“雜湊操作”,以生成稱為“摘要”的東西,附加在待發送的資料塊中。當資料和摘要到達其目的地時,就使用HMAC加密演算法來生成另一個校驗和,如果兩個數字相匹配,那麼資料未被做任何篡改。否則,就意味著資料在傳輸或儲存過程中被某些居心叵測的人作了手腳。
實際的典型應用場景是挑戰/響應”(Challenge/Response)身份認證,認證流程如下:
(1) 客戶端向伺服器發出一個驗證請求。
(2) 伺服器接到此請求後生成一個隨機數並通過網路傳輸給客戶端(此為挑戰)。
(3) 客戶端將收到的隨機數結合本地的密碼,通過雙方約定一致的演算法進行HMAC-MD5運算並得到一個結果作為認證證據傳給伺服器(此為響應)。
(4) 與此同時,伺服器也使用該隨機數與儲存在伺服器資料庫中的該客戶金鑰進行HMAC-MD5運算,如果伺服器的運算結果與客戶端傳回的響應結果相同,則認為客戶端是一個合法使用者。
以上是理論背景知識,python中的用法如下:
import hmac
h = hmac.new(b'hi', b'python') #這裡的hi是雙方隨機生成的資料塊,相當於額外加的料,python才是真正的核心資料
print(h.hexdigest())
輸出:
392e75a856ddb4f8203ef82f7f21b391
三、關於加密演算法
以上講述了python中典型的加密演算法的使用。實際上加密演算法和密碼學的理論博大精深,在實際應用中還需要結合各種演算法的特點來進行選擇,在安全性和計算效率之間取得一個可滿足需求的平衡點(如md5的演算法安全性堪憂,sha512的輸出明顯比sha1要複雜得多,另外還有des、3des等演算法等等)