crypt --- 유닉스 비밀번호 확인 함수

소스 코드: Lib/crypt.py


이 모듈은 수정된 DES 알고리즘을 기반으로 하는 단방향 해시 함수인 crypt(3) 루틴에 대한 인터페이스를 구현합니다; 자세한 내용은 유닉스 매뉴얼 페이지를 참조하십시오. 가능한 용도는 실제 암호를 저장하지 않고 암호를 확인하기 위해 해시 된 암호를 저장하거나 사전으로 유닉스 암호를 해독하려고 시도하는 것을 포함합니다.

이 모듈의 동작은 실행 중인 시스템의 crypt(3) 루틴의 실제 구현에 따라 달라집니다. 따라서, 현재 구현에서 사용할 수 있는 모든 확장을 이 모듈에서도 사용할 수 있습니다.

해싱 방법

버전 3.3에 추가.

crypt 모듈은 해싱 방법 목록을 정의합니다 (모든 플랫폼에서 모든 방법을 사용할 수 있는 것은 아닙니다):

crypt.METHOD_SHA512

SHA-512 해시 함수를 기반으로 16문자의 솔트(salt)와 86문자의 해시를 사용하는 모듈형 암호 형식(Modular Crypt Format) 방법. 이것은 가장 강력한 방법입니다.

crypt.METHOD_SHA256

SHA-256 해시 함수를 기반으로 16자의 솔트와 43자의 해시를 사용하는 또 다른 모듈형 암호 형식 방법.

crypt.METHOD_BLOWFISH

Blowfish 암호를 기반으로 22문자의 솔트와 31문자의 해시를 사용하는 또 다른 모듈형 암호 형식 방법.

버전 3.7에 추가.

crypt.METHOD_MD5

MD5 해시 함수를 기반으로 8자의 솔트와 22자의 해시를 사용하는 또 다른 모듈형 암호 형식 방법.

crypt.METHOD_CRYPT

2문자의 솔트와 13문자의 해시를 사용하는 전통적인 방법. 이것은 가장 약한 방법입니다.

모듈 어트리뷰트

버전 3.3에 추가.

crypt.methods

사용 가능한 비밀번호 해싱 알고리즘 리스트, crypt.METHOD_* 객체들. 이 리스트는 가장 강한 것부터 가장 약한 것 순으로 정렬됩니다.

모듈 함수

crypt 모듈은 다음 함수를 정의합니다:

crypt.crypt(word, salt=None)

word는 대개 프롬프트나 그래픽 인터페이스에서 입력한 사용자의 비밀번호입니다. 선택적 saltmksalt()에서 반환된 문자열, crypt.METHOD_* 값 중 하나(모든 플랫폼에서 모든 것을 사용할 수 있는 것은 아니지만), 또는 이 함수가 반환하는 솔트를 포함한 전체 암호화된 비밀번호입니다. salt가 제공되지 않으면, (methods()에서 반환되는) 가장 강력한 방법이 사용됩니다.

비밀번호 확인은 일반적으로 word로 평문 비밀번호를 전달하는 것으로 수행됩니다. 이전 crypt() 호출의 전체 결과와 이 호출의 결과가 같아야 합니다.

salt(무작위의 2자나 16자 문자열, 방법을 가리키기 위해 앞에 $digit$가 붙을 수 있음)는 암호화 알고리즘을 교란하는 데 사용됩니다. salt의 문자는 $digit$를 앞에 붙이는 모듈형 암호 형식을 제외하고는 [./a-zA-Z0-9] 집합에 있어야 합니다.

해시 된 비밀번호를 문자열로 반환합니다. 이 문자열은 솔트와 같은 알파벳의 문자로 구성됩니다.

몇 가지 crypt(3) 확장이 salt에 다른 크기의 다른 값을 허용하기 때문에, 암호를 확인할 때 전체 암호화된 비밀번호를 솔트로 사용하는 것이 좋습니다.

버전 3.3에서 변경: salt에 대한 문자열 외에 crypt.METHOD_* 값을 받아들입니다.

crypt.mksalt(method=None, *, rounds=None)

지정된 방법의 무작위로 생성된 솔트를 반환합니다. method가 주어지지 않으면, methods()에 의해 반환된 가장 강력한 방법이 사용됩니다.

반환 값은 salt 인자로 crypt()에 전달하기에 적합한 문자열입니다.

roundsMETHOD_SHA256, METHOD_SHA512METHOD_BLOWFISH에 대한 라운드 수를 지정합니다. METHOD_SHA256METHOD_SHA512의 경우 1000999_999_999 사이의 정수여야 하며, 기본값은 5000입니다. METHOD_BLOWFISH의 경우 16(24)과 2_147_483_648(231) 사이의 2의 거듭제곱이어야 하며, 기본값은 4096(212)입니다.

버전 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")