python模組之hashlib
加密演算法介紹
HASH
Hash,一般翻譯做“雜湊”,也有直接音譯為”雜湊”的,就是把任意長度的輸入(又叫做預對映,pre-image),通過雜湊演算法,變換成固定長度的輸出,該輸出就是雜湊值。這種轉換是一種壓縮對映,也就是,雜湊值的空間通常遠小於輸入的空間,不同的輸入可能會雜湊成相同的輸出,而不可能從雜湊值來唯一的確定輸入值。
簡單的說就是一種將任意長度的訊息壓縮到某一固定長度的訊息摘要的函式。
HASH主要用於資訊保安領域中加密演算法,他把一些不同長度的資訊轉化成雜亂的128位的編碼裡,叫做HASH值.也可以說,hash就是找到一種資料內容和資料存放地址之間的對映關係
MD5
什麼是MD5演算法
MD5訊息摘要演演算法(英語:MD5 Message-Digest Algorithm),一種被廣泛使用的密碼雜湊函式,可以產生出一個128位的雜湊值(hash value),用於確保資訊傳輸完整一致。MD5的前身有MD2、MD3和MD4。
MD5功能
輸入任意長度的資訊,經過處理,輸出為128位的資訊(數字指紋);
不同的輸入得到的不同的結果(唯一性);
MD5演算法的特點
- 壓縮性:任意長度的資料,算出的MD5值的長度都是固定的
- 容易計算:從原資料計算出MD5值很容易
- 抗修改性:對原資料進行任何改動,修改一個位元組生成的MD5值區別也會很大
- 強抗碰撞:已知原資料和MD5,想找到一個具有相同MD5值的資料(即偽造資料)是非常困難的。
MD5演算法是否可逆?
MD5不可逆的原因是其是一種雜湊函式,使用的是hash演算法,在計算過程中原文的部分資訊是丟失了的。
MD5用途
-
防止被篡改:
-
比如傳送一個電子文件,傳送前,我先得到MD5的輸出結果a。然後在對方收到電子文件後,對方也得到一個MD5的輸出結果b。如果a與b一樣就代表中途未被篡改。
-
比如我提供檔案下載,為了防止不法分子在安裝程式中新增木馬,我可以在網站上公佈由安裝檔案得到的MD5輸出結果。
-
SVN在檢測檔案是否在CheckOut後被修改過,也是用到了MD5.
-
-
防止直接看到明文:
- 現在很多網站在資料庫儲存使用者的密碼的時候都是儲存使用者密碼的MD5值。這樣就算不法分子得到資料庫的使用者密碼的MD5值,也無法知道使用者的密碼。(比如在UNIX系統中使用者的密碼就是以MD5(或其它類似的演算法)經加密後儲存在檔案系統中。當用戶登入的時候,系統把使用者輸入的密碼計算成MD5值,然後再去和儲存在檔案系統中的MD5值進行比較,進而確定輸入的密碼是否正確。通過這樣的步驟,系統在並不知道使用者密碼的明碼的情況下就可以確定使用者登入系統的合法性。這不但可以避免使用者的密碼被具有系統管理員許可權的使用者知道,而且還在一定程度上增加了密碼被破解的難度。)
-
防止抵賴(數字簽名):
- 這需要一個第三方認證機構。例如A寫了一個檔案,認證機構對此檔案用MD5演算法產生摘要資訊並做好記錄。若以後A說這檔案不是他寫的,權威機構只需對此檔案重新產生摘要資訊,然後跟記錄在冊的摘要資訊進行比對,相同的話,就證明是A寫的了。這就是所謂的“數字簽名”。
SHA-1
安全雜湊演算法(Secure Hash Algorithm)主要適用於數字簽名標準(Digital Signature Standard DSS)裡面定義的數字簽名演算法(Digital Signature Algorithm DSA)。對於長度小於2^64位的訊息,SHA1會產生一個160位的訊息摘要。當接收到訊息的時候,這個訊息摘要可以用來驗證資料的完整性。
SHA是美國國家安全域性設計的,由美國國家標準和技術研究院釋出的一系列密碼雜湊函式。
由於MD5和SHA-1於2005年被山東大學的教授王小云破解了,科學家們又推出了SHA224, SHA256, SHA384, SHA512,當然位數越長,破解難度越大,但同時生成加密的訊息摘要所耗時間也更長。目前最流行的是加密演算法是SHA-256 .
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慢。
Python的 提供的相關模組
用於加密相關的操作,3.x裡代替了md5模組和sha模組,主要提供 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 ...") m = hashlib.md5() m.update(b'alex') # 需要傳二進位制格式 print(m.hexdigest()) # 534b44a19bf18d20b71ecc4eb77c572f # 由32個組成,16進位制每兩個是一個字元,正好一共128位。 print(m.digest()) # b'SKD\xa1\x9b\xf1\x8d \xb7\x1e\xccN\xb7|W/' 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 ########