crypt– 检查Unix密码功能

源代码: Lib / crypt.py


这个模块实现了crypt(3)例程,它是基于修改的DES算法的单向散列函数;有关更多详细信息,请参见Unix联机帮助页可能的用途包括存储散列密码,以便您可以在不存储实际密码的情况下检查密码,或者尝试用字典破解Unix密码.

请注意,此模块的行为取决于crypt(3)在运行系统中的例程。因此,当前实现中可用的任何扩展也将在该模块上可用.

哈希方法

3.3版本中的新功能

cryptmodule定义了散列方法列表(并非所有平台都可以使用所有方法):

crypt.METHOD_SHA512
模块化加密格式方法,基于SHA-512哈希函数,具有16个字符的盐和86个字符哈希值。这是最强的方法.
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。这是最弱的方法.

模块属性

版本3.3.

crypt.methods
可用密码哈希算法列表,如crypt.METHOD_*对象。这个列表是从最强的最左边排序的.

模块功能

crypt模块定义了以下功能:

crypt.cryptword, 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.mksaltmethod=None, *, rounds=None
返回指定方法的随机生成的salt。如果没有给出method,则使用methods()返回的最强方法.

返回值是一个适合传递的字符串salt参数crypt().

rounds指定METHOD_SHA256,METHOD_SHA512METHOD_BLOWFISH的轮数。对于METHOD_SHA256METHOD_SHA512它必须是1000999_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")

评论被关闭。