1. 程式人生 > >函式和常用模組【day06】:hashlib模組(十二)

函式和常用模組【day06】:hashlib模組(十二)

本節內容

1、簡述

2、加密

3、sha1加密

4、sha256加密

5、sha384加密

6、sha512加密

7、hmac加密

一、簡述

  我們寫程式中,經常需要對字串進行MD5加密,python中也支援這種加密,下面說說,這個加密模組:hashlib。

二、MD5加密

  原則:只要你的輸入是固定的,你的輸出也一定是固定的。MD5是在hash上更改的,主要做檔案的一致性

1、md5加密

1 2 3 4 5 6 7 8 9 10 11 12 import  hashlib   =  hashlib.md5()   #建立一個MD5物件 m.update(b "zhang" )    #在python3中需要是2進位制的值,所以字串前加b
print (m.hexdigest())   #以16進位制列印MD5值 #輸出 d0cd2693b3506677e4c55e91d6365bff   m.update(b "qigao" ) print (m.hexdigest())
#輸出 0bfca190ecc60e44cbc739ca9c252133

2、檔案內容MD5值

說明:如果我們想得到一個檔案所有內容的MD5值,我們所做的方法是迴圈這個檔案,獲取每行的MD5值,但是這樣生成的MD5值的效率會變慢,因為每一行都需要計算。這樣我們還不如直接把檔案的所有內容加載出來,直接計算它的MD5值,這樣反而快些。

程式碼如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import  hashlib   =  hashlib.md5()   #建立MD5物件m m.update(b "zhang" ) print (m.hexdigest()) #輸出 d0cd2693b3506677e4c55e91d6365bff   m.update(b "qigao" ) print (m.hexdigest()) #輸出 0bfca190ecc60e44cbc739ca9c252133   m2  =  hashlib.md5()     #建立MD5物件m2 m2.update(b "zhangqigao" ) print (m2.hexdigest()) #輸出 0bfca190ecc60e44cbc739ca9c252133

 注:由上面的程式碼可以看出,你讀到最後一行的字串的MD5值跟一下子讀取所有內容的MD5值是一樣的,這是為什麼呢?其實這邊update做了一個拼接功能,m.update(b"zhang")是返回的字串"zhang"的MD5值,但是到了第二個m.update("qigao")的值並不是"qigao"的字串的MD5值,它需要拼接前面的字串,應該是m.update(b"zhangqigao")的MD5值,所以相當於m.update(b"zhang"),m.update(b"qigao") = m.update(b"zhang"+b"qigao")。

三、sha1加密

1 2 3 4 5 6 7 8 import  hashlib   hash  =  hashlib.sha1() hash .update(b "zhangqigao" ) print ( hash .hexdigest())   #輸出 c8b2a6571067f92133b5b43a085f1ddd36e8c3fb

四、sha256加密

說明:sha256用的比較多,相比MD5要更加的安全

1 2 3 4 5 6 7 8 import  hashlib   hash  =  hashlib.sha256() hash .update(b "zhangqigao" ) print ( hash .hexdigest())   #輸出 0634de5fe3d009fd0ec76ab3d97ab0fe37969b696e8d6550797cf3b446dd78ba

五、sha384加密

1 2 3 4 5 6 7 8 import  hashlib   hash  =  hashlib.sha384() hash .update(b "zhangqigao" ) print ( hash .hexdigest())   #輸出 3489c64e31671094ca1afde35fd31ee9b09cdb90c3728f31696829e8a56be311e1405d537179e62d236e6d70a4f13ff4

六、sha512加密

1 2 3 4 5 6 7 8 import  hashlib   hash  =  hashlib.sha512() hash .update(b "zhangqigao" ) print ( hash .hexdigest())   #輸出 cb09fd5a519b2b075f4aa5965a39657df900fff832b73d161a426512b6023ab8c1c0872a7b2d50055cbd75c4b6f374cda0615be9530f7f4b7dc08ab3f266325d

注意:

  1. 以上這幾種,其實都是對MD5加密的不同演算法
  2. 其中sha256用的最多,比MD5要安全的多
  3. 有些公司會用加鹽方式加密,比如:把字串"zhangqigao",通過一定的演算法變成"zhang.qi.gao",當然這種演算法自己肯定要知道,然後MD5加密,當然每個公司的加鹽方式是不一樣的。

七、hmac加密

其實以上還不是最牛的,最牛的是下面這種,叫hmac加密,它內部是對我們建立key和內容進行處理再進行加密。

雜湊訊息鑑別碼,簡稱HMAC,是一種基於訊息鑑別碼MAC(Message Authentication Code)的鑑別機制。使用HMAC時,訊息通訊的雙方,通過驗證訊息中加入的鑑別金鑰K來鑑別訊息的真偽;

一般用於網路通訊中訊息加密,前提是雙方先要約定好key,就像接頭暗號一樣,然後訊息傳送把用key把訊息加密,接收方用key + 訊息明文再加密,拿加密後的值 跟 傳送者的相對比是否相等,這樣就能驗證訊息的真實性,及傳送者的合法性了。

程式碼如下:

1 2 3 4 5 6 7 import  hmac  #匯入hmac模組   hash  =  hmac.new(b "zhang" ,b "qigao" #zhang是key,qigao是內容 print ( hash .hexdigest())   #輸出 2f124c86aeb5142246198f77a142e855