crypt —— 檢查 Unix 口令的函數?
源代碼: Lib/struct.py
本模塊實現了連接 crypt(3) 的接口,是一個基于改進 DES 算法的單向散列函數;更多細節請參閱 Unix man 手冊。可能的用途包括保存經過哈希的口令,這樣就可以在不存儲實際口令的情況下對其進行驗證,或者嘗試用字典來破解 Unix 口令。
請注意,本模塊的執行取決于當前系統中 crypt(3) 的實際實現。 因此,當前實現版本可用的擴展均可在本模塊使用。
哈希方法?
3.3 新版功能.
crypt 模塊定義了哈希方法的列表(不是所有的方法在所有平臺上都可用)。
-
crypt.METHOD_SHA512? 基于 SHA-512 哈希函數的模塊化加密格式方法,具備 16 個字符的 salt 和 86個字符的哈希算法。這是最強的哈希算法。
-
crypt.METHOD_SHA256? 另一種基于 SHA-256 哈希函數的模塊化加密格式方法,具備 16 個字符的 salt 和 43 個字符的哈希算法。
-
crypt.METHOD_BLOWFISH? 另一種基于 Blowfish 的模塊化加密格式方法,有 22 個字符的 salt 和 31 個字符的哈希算法。
3.7 新版功能.
-
crypt.METHOD_MD5? 另一種基于 MD5 哈希函數的模塊化加密格式方法,具備 8 個字符的 salt 和 22 個字符的哈希算法。
-
crypt.METHOD_CRYPT? 傳統的方法,具備 2 個字符的 salt 和 13 個字符的哈希算法。這是最弱的方法。
模塊函數?
crypt 模塊定義了以下函數:
-
crypt.crypt(word, salt=None)? word 通常是用戶在提示符或圖形界面上輸入的口令。可選參數 salt 要么是
mksalt()返回的字符串,即crypt.METHOD_*之一(盡管不是所有平臺都可用),要么就是一個完全加密的包含 salt 值的口令,正如本函數的返回值。如果未給出 salt,將使用最強的哈希方法(methods()返回)。查驗口令通常是傳入純文本密碼 word ,和之前
crypt()調用的結果進行比較,應該與本次調用的結果相同。salt (隨機的 2 或 16 個字符的字符串,可能帶有
$digit{TX-PL-LABEL}#x60;前綴以提示相關方法) 將被用來擾亂加密算法。 salt 中的字符必須在[./a-zA-Z0-9]集合中,但 Modular Crypt Format 除外,它會帶有$digit{TX-PL-LABEL}#x60;前綴。返回哈希后的口令字符串,將由 salt 所在字母表中的字符組成。
由于有些 crypt(3) 擴展允許不同的值, salt 大小也可不同,建議在查驗口令時采用完整的加密后口令作為 salt。
在 3.3 版更改: 除了字符串之外, salt 還可接受
crypt.METHOD_*值。
-
crypt.mksalt(method=None, *, rounds=None)? 返回用指定方法隨機生成的 salt。如果沒有給出 method,則使用
methods()返回的最強方法。返回一個字符串,可用作傳入
crypt()的 salt 參數。rounds 指定了
METHOD_SHA256,METHOD_SHA512和METHOD_BLOWFISH的循環次數。 對于METHOD_SHA256和METHOD_SHA512而言,必須為介于1000和999_999_999之間的整數,默認值為5000。 而對于METHOD_BLOWFISH,則必須為16(24) 和2_147_483_648(231) 之間的二的冪,默認值為4096(212)。3.3 新版功能.
在 3.7 版更改: 加入 rounds 參數。
例子?
以下簡單示例演示了典型用法(需要一個時間固定的比較操作來限制留給計時攻擊的暴露面。 hmac.compare_digest() 即很適用):
采用當前強度最高的方法生成哈希值,并與原口令進行核對:
import crypt
from hmac import compare_digest as compare_hash
hashed = crypt.crypt(plaintext)
if not compare_hash(hashed, crypt.crypt(plaintext, hashed)):
raise ValueError("hashed version doesn't validate against original")
