1. 程式人生 > 程式設計 >Python3 hashlib密碼雜湊演算法原理詳解

Python3 hashlib密碼雜湊演算法原理詳解

1.hashlib密碼雜湊

hashlib模組定義了一個API來訪問不同的密碼雜湊演算法。要使用一個特定的雜湊演算法,可以用適當的構造器函式或new()來建立一個雜湊物件。不論使用哪個具體的演算法,這些物件都使用相同的API。

1.1 雜湊演算法

由於hashlib有OpenSSL提供“底層支援”,所以OpenSSL庫提供的所有演算法都可用,包括:

  • md5
  • sha1
  • sha224
  • sha256
  • sha384
  • sha512

有些演算法在所有平臺上都可用,而有些則依賴於底層庫。這兩種演算法分別由algorithms_guaranteed和algorithms_available提供。

import hashlib
print('Guaranteed:\n{}\n'.format(
  ','.join(sorted(hashlib.algorithms_guaranteed))))
print('Available:\n{}'.format(
  ','.join(sorted(hashlib.algorithms_available))))

Guaranteed:
blake2b,blake2s,md5,sha1,sha224,sha256,sha384,sha3_224,sha3_256,sha3_384,sha3_512,sha512,shake_128,shake_256

Available:
DSA,DSA-SHA,MD4,MD5,RIPEMD160,SHA,SHA1,SHA224,SHA256,SHA384,SHA512,blake2b,dsaEncryption,dsaWithSHA,ecdsa-with-SHA1,md4,ripemd160,sha,shake_256,whirlpool

1.2 MD5示例

要為一個數據塊(在這裡就是轉換為一個位元組串的Unicode串)計算MD5雜湊或摘要,首先要建立雜湊物件,然後增加資料,最後呼叫digest()或hexdigest()。

import hashlib
lorem = '''Lorem ipsum dolor sit amet,consectetur adipisicing
elit,sed do eiusmod tempor incididunt ut labore et dolore magna
aliqua. Ut enim ad minim veniam,quis nostrud exercitation
ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis
aute irure dolor in reprehenderit in voluptate velit esse cillum
dolore eu fugiat nulla pariatur. Excepteur sint occaecat
cupidatat non proident,sunt in culpa qui officia deserunt
mollit anim id est laborum.'''
h = hashlib.md5()
h.update(lorem.encode('utf-8'))
print(h.hexdigest())

這個例子使用了hexdigest()方法而不是digest(),因為要格式化輸出以便清楚的列印。如果可以接受二進位制摘要值,那麼可以使用digest()。

Python3 hashlib密碼雜湊演算法原理詳解

1.3 SHA1示例

SHA1摘要也用同樣的方式計算。

import hashlib
lorem = '''Lorem ipsum dolor sit amet,sunt in culpa qui officia deserunt
mollit anim id est laborum.'''
h = hashlib.sha1()
h.update(lorem.encode('utf-8'))
print(h.hexdigest())

這個例子中的摘要值有所不同,因為MD5和SHA1演算法不同。

Python3 hashlib密碼雜湊演算法原理詳解

1.4 增量更新

雜湊計算器的update()方法可以反覆呼叫。每次呼叫時,都會根據提供的附加文字更新摘要。增量更新比將整個檔案讀入記憶體更高效,而且能生成相同的結果。

import hashlib
lorem = '''Lorem ipsum dolor sit amet,sunt in culpa qui officia deserunt
mollit anim id est laborum.'''
h = hashlib.md5()
h.update(lorem.encode('utf-8'))
all_at_once = h.hexdigest()
def chunkize(size,text):
  "Return parts of the text in size-based increments."
  start = 0
  while start < len(text):
    chunk = text[start:start + size]
    yield chunk
    start += size
  return
h = hashlib.md5()
for chunk in chunkize(64,lorem.encode('utf-8')):
  h.update(chunk)
line_by_line = h.hexdigest()
print('All at once :',all_at_once)
print('Line by line:',line_by_line)
print('Same    :',(all_at_once == line_by_line))

這個例子展示了讀取或生成資料時如何以增量方式更新一個摘要。

Python3 hashlib密碼雜湊演算法原理詳解

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。