crypt- 检查Unix密码的功能 – Unix特定服务(Python教程)(参考资料)
crypt
– 检查Unix密码的功能
源代码: Lib / crypt.py
这个模块实现了crypt(3)例程,它是基于修改的DES算法的单向散列函数;有关更多详细信息,请参见Unix联机帮助页可能的用途包括存储散列密码,以便您可以在不存储实际密码的情况下检查密码,或者尝试用字典破解Unix密码.
请注意,此模块的行为取决于crypt(3)在运行系统中的例程。因此,当前实现中可用的任何扩展也将在该模块上可用.
哈希方法
3.3版本中的新功能
crypt
module定义了散列方法列表(并非所有平台都可以使用所有方法):
crypt.
METHOD_SHA256
- 另一种基于SHA-256哈希函数的16字符盐和43字符哈希的模块化密码格式方法.
crypt.
METHOD_BLOWFISH
- 另一种基于Blowfish密码的22字符盐和31字符散列的模块化密码格式方法
新版本3.7.
crypt.
METHOD_MD5
- 另一种基于MD5哈希函数的8字符salt和22字符哈希模块化密码格式方法.
crypt.
METHOD_CRYPT
- 传统方法有2个字符的盐和13个字符的hash。这是最弱的方法.
模块功能
crypt
模块定义了以下功能:
crypt.
crypt
(word, salt=None)- word通常是在提示符或图形界面中键入的用户密码。可选的salt是从
mksalt()
返回的字符串,其中一个crypt.METHOD_*
值(尽管并非所有平台都可以使用),或者由此函数返回的包含salt的完整加密密码。如果salt没有提供,将使用最强的方法(由methods()
).检查密码通常是通过传递明文密码word和以前的完整结果
crypt()
呼叫,应该与此呼叫的结果相同.salt(随机的2或16个字符串,可能以为前缀
$digit$
表示方法)将用于干扰加密算法。salt中的字符必须在[./a-zA-Z0-9]
的集合中,但模块化的加密格式除了$digit$
.将哈希密码作为字符串返回,该字符串将由与盐相同的字母组成.
几个以上crypt(3)扩展允许不同的值,在salt,建议在检查密码时使用完整的cryptedpassword作为盐.
改版3.3:接受
crypt.METHOD_*
除了salt.
crypt.
mksalt
(method=None, *, rounds=None)- 返回指定方法的随机生成的salt。如果没有给出method,则使用
methods()
返回的最强方法.返回值是一个适合传递的字符串salt参数
crypt()
.rounds指定
METHOD_SHA256
,METHOD_SHA512
和METHOD_BLOWFISH
的轮数。对于METHOD_SHA256
和METHOD_SHA512
它必须是1000
和999_999_999
,默认是5000
。对于METHOD_BLOWFISH
它必须是16
(2 4 )和2_147_483_648
(2 31 ),默认是4096
(2 12 ).3.3版本中的新功能
版本3.7更改:添加了rounds参数.
示例
一个简单的例子说明了典型的使用(需要一个恒定时间的比较操作来限制暴露于定时攻击.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
要使用最强大的可用方法生成密码哈希,并将其与原始密码进行检查:
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")
评论被关闭。