Python模組分析:第2節-hashlib加密模組

Mark發表於2019-02-16

上一篇文章:Python模組分析:第1節-random模組
下一篇文章:Python模組分析:第3節-typing模組

hashlib模組是用來對字串進行hash加密的模組,明文與密文是一一對應不變的關係;用於註冊、登入時使用者名稱、密碼等加密使用。

一、函式分析

1、共有5種加密演算法

md5(),sha1(),sha224(),sha256(),sha3840(),sha512(),分別得到不同的加密密文。

2、hashlib.hexdigest():獲取加密的密文,16進位制,無引數
3、hashlib.digest():獲取加密的密文,二進位制,無引數
4、hashlib.copy():複製一份當前建立的hash物件,無引數
5、update(str1,encoding(`utf-8“)):更新加密的密文,得到的密文與原來的密文不相同
6、hash.name:檢視當前獲得的hash物件的加密演算法
7、hash.digest_size:hash金鑰佔多少個位元組
8、hash.block_size:hash資料塊的大小
9、hashlib.algorithms_guaranteed:檢視所有平臺都支援的hash演算法
10、hashlib.algorithms_available:檢視所有的hash加密演算法

程式碼例項:

import hashlib

def hash_fun_1(str1):
    #建立一個hahsh物件並對str1加密
    m=hashlib.md5(str1.encode(`utf-8`))
    print(`獲取加密的密文,16進位制,無引數`,m.hexdigest())
    print(`獲取加密的密文,二進位制,無引數:`,m.digest())
    print(`獲取hash塊的大小:`,m.block_size)
    print(`hash金鑰佔多少個位元組:`,m.digest_size)
    print(`檢視當前獲得的hash物件的加密演算法`,m.name)

    #更新密文
    m.update(str1.encode(`utf-8`))
    print(`獲取加密的密文,16進位制,無引數`, m.hexdigest())
    print(`獲取加密的密文,二進位制,無引數:`, m.digest())
    print(`獲取hash塊的大小:`, m.block_size)
    print(`hash金鑰佔多少個位元組:`, m.digest_size)
    print(`檢視當前獲得的hash物件的加密演算法`, m.name)

if __name__ == `__main__`:
    hash_fun_1(`mark`)

結果:

獲取加密的密文,16進位制,無引數 ea82410c7a9991816b5eeeebe195e20a
獲取加密的密文,二進位制,無引數: b`xeax82Ax0czx99x91x81k^xeexebxe1x95xe2
`
獲取hash塊的大小: 64
hash金鑰佔多少個位元組: 16
檢視當前獲得的hash物件的加密演算法 md5
獲取加密的密文,16進位制,無引數 ac673f4dbac79922838901b5974a419a
獲取加密的密文,二進位制,無引數: b`xacg?Mxbaxc7x99"x83x89x01xb5x97JAx9a`
獲取hash塊的大小: 64
hash金鑰佔多少個位元組: 16
檢視當前獲得的hash物件的加密演算法 md5

二、運用:

1、建立雜湊物件,有兩種方式:
m=hashlib.new(`md5`,b`cai`)#選擇md5加密函式加密字串‘cai’
m=hashlib.md5(`cai`.encode(`utf-8`))#加密的另一種寫法
2、特性用法:當需要加密的字串過大的時候,可以使用同一個hash物件分多次加密,update(a)+update(b)=update(a+b)

舉例:

import hashlib

m1=hashlib.md5()
m2=m1.copy()
m1.update(`a`.encode(`utf-8`))
m1.update(`b`.encode(`utf-8`))
print(m1.hexdigest())#輸出密文
m2.update(`ab`.encode(`utf-8`))
print(m2.hexdigest())#輸出另一個密文

執行結果:

187ef4436122d1cc2f40dc2b92f0eba0
187ef4436122d1cc2f40dc2b92f0eba0

三、hash演算法加密

加密演算法得到的密文不可逆,但是密文與明文之間的關係是一一對應的,這就使得解密出現了可能,使用大資料儲存密文與明文對用關係,如果資料庫內剛好有對應的密文,就可以找到明文完成解密,常用的解密網站:http://www.cmd5.com/,通過輸入密文查詢對於的明文。

為了增大破解的難度,一般需要對密碼進行多次迭代加密,hashlib模組有一個專門的函式。

程式碼例項:

import hashlib
import binascii

#sha256為演算法名稱,12345678為要加密的密碼
#mark指的是雜質,額外新增的東西,使得破解更難
#10 000是迭代次數,可以理解為加密次數
pwd=hashlib.pbkdf2_hmac(`sha256`,b`12345678`,b`mark`,10000)
print(binascii.hexlify(pwd).decode(`utf-8`))

結果:

129d11e9ba1f3ef4e1393516d434f356363ffe68d7baca37fd1e91f0e87abe36

上一篇文章:Python模組分析:第1節-random模組
下一篇文章:Python模組分析:第3節-typing模組

相關文章