hashlib模塊

1、HASH

  Hash通常翻譯爲"散列",或音譯爲"哈希"。將任意長度的輸入(也叫預映射,pre-image)經過散列算法,變換爲固定長度的輸出,這個輸出就是散列值。這種轉換是一種壓縮映射,散列值的空間一般遠小於輸入的空間。不一樣輸入可能會散列爲相同輸出,所以不可能從散列值來惟一肯定輸入值。python

  Hash定義:一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數。
  Hash功能:主要用於信息安全領域中加密算法,他把一些不一樣長度的信息轉化成雜亂的128位的編碼裏,叫作HASH值.
git

  hash就是找到一種數據內容和數據存放地址之間的映射關係算法

2、MD5

一、MD5概念

MD5訊息摘要演算法(英語:MD5 Message-Digest Algorithm)。是一種被普遍使用的密碼雜湊函數,能夠產生出一個128位的散列值(hash value),用於確保信息傳輸完整一致。MD5的前身有MD二、MD3和MD4。
緩存

二、MD5功能

  (1)輸入任意長度的信息,通過處理,輸出爲128位的信息(數字指紋);安全

  (2)不一樣的輸入獲得的不一樣的結果(惟一性)函數

三、MD5算法的特色

  壓縮性:任意長度的數據,算出的MD5值的長度都是固定的
  容易計算:從原數據計算出MD5值很容易
  抗修改性:對原數據進行任何改動,修改一個字節生成的MD5值區別也會很大
  強抗碰撞:已知原數據和MD5,想找到一個具備相同MD5值的數據(即僞造數據)是很是困難的。編碼

MD5算法是否可逆?

  MD5不可逆的緣由是其是一種散列函數,使用的是hash算法,在計算過程當中原文的部分信息是丟失了的。加密

四、MD5用途:

  (1)防止被篡改spa

  (2)防止直接看到明文翻譯

  好比在UNIX系統中用戶的密碼就是以MD5(或其它相似的算法)經加密後存儲在文件系統中。當用戶登陸的時候,系統把用戶輸入的密碼計算成MD5值,而後再去和保存在文件系統中的MD5值進行比較,進而肯定輸入的密碼是否正確。經過這樣的步驟,系統在並不知道用戶密碼的明碼的狀況下就能夠肯定用戶登陸系統的合法性。這不但能夠避免用戶的密碼被具備系統管理員權限的用戶知道,並且還在必定程度上增長了密碼被破解的難度。)

  (3)防止抵賴(數字簽名)

  這須要一個第三方認證機構。例如A寫了一個文件,認證機構對此文件用MD5算法產生摘要信息並作好記錄。若之後A說這文件不是他寫的,權威機構只需對此文件從新產生摘要信息,而後跟記錄在冊的摘要信息進行比對,相同的話,就證實是A寫的了。這就是所謂的「數字簽名」。

3、SHA-1(安全哈希算法)

  安全哈希算法(Secure Hash Algorithm)主要適用於數字簽名標準(Digital Signature Standard DSS)裏面定義的數字簽名算法(Digital Signature Algorithm DSA)。對於長度小於2^64位的消息,SHA1會產生一個160位的消息摘要。當接收到消息的時候,這個消息摘要能夠用來驗證數據的完整性。

  SHA是美國國家安全局設計的,由美國國家標準和技術研究院發佈的一系列密碼散列函數。位數越長,破解難度越大,但同時生成加密的消息摘要所耗時間也更長。目前最流行的是加密算法是SHA-256 .

4、MD5與SHA-1對比

  MD5與SHA-1均是從MD4發展而來,它們的結構和強度等特性有不少類似之處。

  SHA-1與MD5的最大區別在於其摘要比MD5摘要長32 比特。對於強行攻擊,產生任何一個報文使之摘要等於給定報文摘要的難度:MD5是2128數量級的操做,SHA-1是2160數量級的操做。產生具備相同摘要的兩個報文的難度:MD5是264是數量級的操做,SHA-1 是280數量級的操做。於是,SHA-1對強行攻擊的強度更大。但因爲SHA-1的循環步驟比MD5多80:64且要處理的緩存大160比特:128比特,SHA-1的運行速度比MD5慢

5、hashlib模塊使用

一、python的md5加密與加鹽

#md5加密是不可反解的
import hashlib
#實例化對象
obj=hashlib.md5()      #先建立一個md5的對象
#寫入要加密的字節
obj.update("admin".encode("utf-8"))   #對誰加密就把誰道前面,python3中必須是字節,因此必須用.encode()
#獲取密文
secret=obj.hexdigest()
print(secret)
##############################################################
 
import hashlib
obj=hashlib.md5(b'12334')                #實例化md5的時候能夠給傳個參數,這叫加鹽
obj.update("admin".encode("utf-8"))      #是再加密的時候傳入本身的一塊字節,
secret=obj.hexdigest()
print(secret)
##############################################################
 
#由於用戶密碼已經被加密過了,並且是加鹽的,因此再用戶驗證的時候用字符串或者直接的加密的的字節都不能正確判斷,只能用加鹽的字節所判斷
 
import hashlib
SALT = b'2erer3asdfwerxdf34sdfsdfs90'
def md5(pwd):
    # 實例化對象
    obj = hashlib.md5(SALT)
    # 寫入要加密的字節
    obj.update(pwd.encode('utf-8'))
    # 獲取密文
    return obj.hexdigest()
 
user = input("請輸入用戶名:")
pwd = input("請輸入密碼:")
if user == 'oldboy' and md5(pwd) == 'c5395258d82599e5f1bec3be1e4dea4a':
    print('登陸成功')
else:
    print('登陸失敗')

 

  python3中主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法

import hashlib

m = hashlib.md5()
m.update(b"Hello")
m.update(b"It's me")
print(m.digest())
m.update(b"It's been a long time since last time we ...")

print(m.digest()) #2進制格式hash
print(len(m.hexdigest())) #16進制格式hash
'''
def digest(self, *args, **kwargs): # real signature unknown
    """ Return the digest value as a string of binary data. """
    pass

def hexdigest(self, *args, **kwargs): # real signature unknown
    """ Return the digest value as a string of hexadecimal digits. """
    pass

'''
import hashlib

# ######## md5 ########

hash = hashlib.md5()
hash.update('admin')
print(hash.hexdigest())

# ######## sha1 ########

hash = hashlib.sha1()
hash.update('admin')
print(hash.hexdigest())

# ######## sha256 ########

hash = hashlib.sha256()
hash.update('admin')
print(hash.hexdigest())


# ######## sha384 ########

hash = hashlib.sha384()
hash.update('admin')
print(hash.hexdigest())

# ######## sha512 ########

hash = hashlib.sha512()
hash.update('admin')
print(hash.hexdigest())
相關文章
相關標籤/搜索