crypt
—— 驗(yàn)證 Unix 口令的函數(shù)?
源代碼: Lib/struct.py
Deprecated since version 3.11, will be removed in version 3.13: The crypt
module is deprecated
(see PEP 594 for details and alternatives).
The hashlib
module is a potential replacement for certain use cases.
本模塊實(shí)現(xiàn)了連接 crypt(3) 的接口,是一個(gè)基于改進(jìn) DES 算法的單向散列函數(shù);更多細(xì)節(jié)請(qǐng)參閱 Unix man 手冊(cè)??赡艿挠猛景ū4娼?jīng)過(guò)哈希的口令,這樣就可以在不存儲(chǔ)實(shí)際口令的情況下對(duì)其進(jìn)行驗(yàn)證,或者嘗試用字典來(lái)破解 Unix 口令。
請(qǐng)注意,本模塊的執(zhí)行取決于當(dāng)前系統(tǒng)中 crypt(3) 的實(shí)際實(shí)現(xiàn)。 因此,當(dāng)前實(shí)現(xiàn)版本可用的擴(kuò)展均可在本模塊使用。
可用性 :Unix。在 VxWorks 中不可用。
哈希方法?
3.3 新版功能.
crypt
模塊定義了哈希方法的列表(不是所有的方法在所有平臺(tái)上都可用)。
- crypt.METHOD_SHA512?
基于 SHA-512 哈希函數(shù)的模塊化加密格式方法,具備 16 個(gè)字符的 salt 和 86個(gè)字符的哈希算法。這是最強(qiáng)的哈希算法。
- crypt.METHOD_SHA256?
另一種基于 SHA-256 哈希函數(shù)的模塊化加密格式方法,具備 16 個(gè)字符的 salt 和 43 個(gè)字符的哈希算法。
- crypt.METHOD_BLOWFISH?
另一種基于 Blowfish 的模塊化加密格式方法,有 22 個(gè)字符的 salt 和 31 個(gè)字符的哈希算法。
3.7 新版功能.
- crypt.METHOD_MD5?
另一種基于 MD5 哈希函數(shù)的模塊化加密格式方法,具備 8 個(gè)字符的 salt 和 22 個(gè)字符的哈希算法。
- crypt.METHOD_CRYPT?
傳統(tǒng)的方法,具備 2 個(gè)字符的 salt 和 13 個(gè)字符的哈希算法。這是最弱的方法。
模塊屬性?
3.3 新版功能.
- crypt.methods?
可用口令哈希算法的列表,形式為
crypt.METHOD_*
對(duì)象。該列表從最強(qiáng)到最弱進(jìn)行排序。
模塊函數(shù)?
crypt
模塊定義了以下函數(shù):
- crypt.crypt(word, salt=None)?
word will usually be a user's password as typed at a prompt or in a graphical interface. The optional salt is either a string as returned from
mksalt()
, one of thecrypt.METHOD_*
values (though not all may be available on all platforms), or a full encrypted password including salt, as returned by this function. If salt is not provided, the strongest method available inmethods
will be used.查驗(yàn)口令通常是傳入純文本密碼 word ,和之前
crypt()
調(diào)用的結(jié)果進(jìn)行比較,應(yīng)該與本次調(diào)用的結(jié)果相同。salt (隨機(jī)的 2 或 16 個(gè)字符的字符串,可能帶有
$digit{TX-PL-LABEL}#x60;
前綴以提示相關(guān)方法) 將被用來(lái)擾亂加密算法。 salt 中的字符必須在[./a-zA-Z0-9]
集合中,但 Modular Crypt Format 除外,它會(huì)帶有$digit{TX-PL-LABEL}#x60;
前綴。返回哈希后的口令字符串,將由 salt 所在字母表中的字符組成。
由于有些 crypt(3) 擴(kuò)展可以接受各種大小的 salt 值,建議在查驗(yàn)口令時(shí)采用完整的加密后口令作為 salt。
在 3.3 版更改: 除了字符串之外, salt 還可接受
crypt.METHOD_*
值。
- crypt.mksalt(method=None, *, rounds=None)?
Return a randomly generated salt of the specified method. If no method is given, the strongest method available in
methods
is used.返回一個(gè)字符串,可用作傳入
crypt()
的 salt 參數(shù)。rounds 指定了
METHOD_SHA256
,METHOD_SHA512
和METHOD_BLOWFISH
的循環(huán)次數(shù)。 對(duì)于METHOD_SHA256
和METHOD_SHA512
而言,必須為介于1000
和999_999_999
之間的整數(shù),默認(rèn)值為5000
。 而對(duì)于METHOD_BLOWFISH
,則必須為16
(24) 和2_147_483_648
(231) 之間的二的冪,默認(rèn)值為4096
(212)。3.3 新版功能.
在 3.7 版更改: 加入 rounds 參數(shù)。
例子?
以下簡(jiǎn)單示例演示了典型用法(需要一個(gè)時(shí)間固定的比較操作來(lái)限制留給計(jì)時(shí)攻擊的暴露面。 hmac.compare_digest()
即很適用):
import pwd
import crypt
import getpass
from hmac import compare_digest as compare_hash
def login():
username = input('Python login: ')
cryptedpasswd = pwd.getpwnam(username)[1]
if cryptedpasswd:
if cryptedpasswd == 'x' or cryptedpasswd == '*':
raise ValueError('no support for shadow passwords')
cleartext = getpass.getpass()
return compare_hash(crypt.crypt(cleartext, cryptedpasswd), cryptedpasswd)
else:
return True
采用當(dāng)前強(qiáng)度最高的方法生成哈希值,并與原口令進(jìn)行核對(duì):
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")