函式和常用模組【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
m
=
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
m
=
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
|
注意:
- 以上這幾種,其實都是對MD5加密的不同演算法
- 其中sha256用的最多,比MD5要安全的多
- 有些公司會用加鹽方式加密,比如:把字串"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
|