hashlib — 보안 해시와 메시지 다이제스트

hashlib — 보안 해시와 메시지 다이제스트

hashlib 모듈은 여러 다른 해시 알고리즘에 대한 공통 인터페이스를 구현해요. FIPS 보안 해시 알고리즘 SHA224, SHA256, SHA384, SHA512(FIPS 180-4 표준에 정의), SHA-3 계열(FIPS 202 표준에 정의), 그리고 레거시 알고리즘 SHA1(이전에는 FIPS의 일부)와 MD5 알고리즘(인터넷 RFC 1321에 정의)이 포함돼요.

adler32 또는 crc32 해시 함수가 필요하면 zlib 모듈에 있어요.

출처: Python documentation

본문

해시 알고리즘

각 해시 타입에 대해 이름이 정해진 생성자 메서드가 하나씩 있어요. 모두 같은 간단한 인터페이스를 가진 해시 객체를 반환해요. 예를 들어 sha256()을 사용해 SHA-256 해시 객체를 만들 수 있어요. 이제 update 메서드로 bytes 유사 객체(보통 bytes)를 이 객체에 공급할 수 있고, 언제든지 digest() 또는 hexdigest() 메서드로 지금까지 공급된 데이터의 연결에 대한 다이제스트를 요청할 수 있어요.

멀티스레딩을 허용하기 위해, 생성자나 .update 메서드에서 한 번에 2047바이트 이상의 데이터를 공급받는 해시를 계산하는 동안 파이썬 GIL이 해제돼요.

이 모듈에 항상 존재하는 생성자는 sha1(), sha224(), sha256(), sha384(), sha512(), sha3_224(), sha3_256(), sha3_384(), sha3_512(), shake_128(), shake_256(), blake2b(), blake2s()예요. md5()도 보통 사용할 수 있지만, 드문 “FIPS 규격” 파이썬 빌드를 사용한다면 누락되거나 차단될 수 있어요.

일부 알고리즘은 알려진 해시 충돌 약점을 가져요(MD5와 SHA1 포함). 자세한 내용은 관련 보안 자료를 참고하세요.

사용법

바이트 문자열 b"Nobody inspects the spammish repetition"의 다이제스트를 얻으려면:

>>> import hashlib
>>> m = hashlib.sha256()
>>> m.update(b"Nobody inspects")
>>> m.update(b" the spammish repetition")
>>> m.digest()
b'\x03\x1e\xdd}Ae\x15\x93\xc5\xfe\\\x00o\xa5u+7\xfd\xdf\xf7\xbcN\x84:\xa6\xaf\x0c\x95\x0fK\x94\x06'
>>> m.hexdigest()
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'

더 간결하게:

>>> hashlib.sha256(b"Nobody inspects the spammish repetition").hexdigest()
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'

생성자

hashlib.new(name, [data, ]*, usedforsecurity=True) — 첫 번째 파라미터로 원하는 알고리즘의 문자열 이름을 받는 일반 생성자예요. 위에 나열된 해시와 OpenSSL 라이브러리가 제공할 수 있는 다른 알고리즘에 접근할 수 있게 해줘요.

hashlib.md5(...), hashlib.sha1(...), hashlib.sha256(...) 등 명명된 생성자는 이렇게 알고리즘 이름을 new()에 전달하는 것보다 빠르지만, 사용 목적이 같아요.

속성

hashlib.algorithms_guaranteed — 이 모듈이 모든 플랫폼에서 지원한다고 보장되는 해시 알고리즘 이름 집합. ‘md5’는 일부 업스트림 공급업체가 제외한 이상한 “FIPS 규격” 파이썬 빌드를 제공함에도 이 목록에 있어요.

hashlib.algorithms_available — 실행 중인 파이썬 인터프리터에서 사용 가능한 해시 알고리즘 이름 집합. new()에 전달하면 인식돼요. algorithms_guaranteed는 항상 하위 집합이에요.

해시 객체

hash.digest_size — 결과 해시의 크기(바이트). hash.block_size — 해시 알고리즘의 내부 블록 크기(바이트).

hash.name — 이 해시의 표준 이름으로, 항상 소문자이고 항상 new()의 파라미터로 적합해요.

hash.update(data) — 해시 객체를 bytes 유사 객체로 갱신해요. 반복 호출은 모든 인자의 연결을 가진 단일 호출과 동일해요. m.update(a); m.update(b)m.update(a+b)와 동일해요.

hash.digest() — 지금까지 update()에 전달된 데이터의 다이제스트를 반환해요. 크기 digest_size의 bytes 객체이며 0부터 255까지의 바이트를 포함할 수 있어요.

hash.hexdigest()digest()와 같지만 다이제스트를 두 배 길이의 16진수 숫자만 포함하는 문자열 객체로 반환해요.

hash.copy() — 해시 객체의 사본(“클론”)을 반환해요. 공통 초기 부분 문자열을 공유하는 데이터의 다이제스트를 효율적으로 계산하는 데 사용할 수 있어요.

SHAKE 가변 길이 다이제스트

shake_128(), shake_256() 은 가변 길이 다이제스트를 제공하며 length_in_bits//2만큼 최대 128비트 또는 256비트의 보안을 제공해요. 이들의 다이제스트 메서드는 길이가 필요해요. shake.digest(length)shake.hexdigest(length) 가 제공돼요.

파일 해싱

hashlib.file_digest(fileobj, digest, /) — 파일 객체의 내용으로 갱신된 다이제스트 객체를 반환해요. fileobj는 바이너리 모드로 읽기 위해 열린 파일 유사 객체여야 해요. digest는 str로서의 해시 알고리즘 이름, 해시 생성자, 또는 해시 객체를 반환하는 호출 가능 객체여야 해요. 버전 3.11에서 추가됨.

키 유도

hashlib.pbkdf2_hmac(hash_name, password, salt, iterations, dklen=None) — PKCS#5 암호 기반 키 유도 함수 2를 제공해요. HMAC을 의사 난수 함수로 사용해요. hash_name은 HMAC용 해시 다이제스트 알고리즘의 이름이고, iterations(반복 횟수)는 해시 알고리즘과 계산 능력에 따라 선택해야 해요. dklen은 파생 키의 길이(바이트)예요. 버전 3.4에서 추가됨.

hashlib.scrypt(password, *, salt, n, r, p, maxmem=0, dklen=64) — RFC 7914에 정의된 scrypt 암호 기반 키 유도 함수를 제공해요. n은 CPU/메모리 비용 요소, r은 블록 크기, p는 병렬화 요소, maxmem은 메모리를 제한하며, dklen은 파생 키의 길이(바이트)예요. 버전 3.6에서 추가됨.

BLAKE2

BLAKE2는 RFC 7693에 정의된 암호화 해시 함수로 두 가지 맛이 있어요:

  • BLAKE2b — 64비트 플랫폼에 최적화, 1~64바이트 크기의 다이제스트 생성.
  • BLAKE2s — 832비트 플랫폼에 최적화, 132바이트 크기의 다이제스트 생성.

BLAKE2는 키드 모드(HMAC보다 빠르고 간단한 대체), 솔티드 해싱, 개인화, 트리 해싱을 지원해요.

hashlib.blake2b(data=b'', *, digest_size=64, key=b'', salt=b'', person=b'', fanout=1, depth=1, leaf_size=0, node_offset=0, node_depth=0, inner_size=0, last_node=False, usedforsecurity=True)hashlib.blake2s(...) 은 BLAKE2b 또는 BLAKE2s 계산을 위한 해당 해시 객체를 반환해요.

  • data — 해시할 초기 데이터 청크. bytes 유사 객체.
  • digest_size — 출력 다이제스트의 크기(바이트).
  • key — 키드 해싱용 키(BLAKE2b는 최대 64바이트, BLAKE2s는 최대 32바이트).
  • salt — 무작위 해싱용 솔트(BLAKE2b는 최대 16바이트, BLAKE2s는 최대 8바이트).
  • person — 개인화 문자열(BLAKE2b는 최대 16바이트, BLAKE2s는 최대 8바이트).

경고: BLAKE2나 SHA-256 같은 다른 일반 목적 암호화 해시 함수로 솔티드 해싱(또는 그냥 해싱)하는 것은 비밀번호 해싱에 적합하지 않아요.

간단한 해싱 예시:

>>> from hashlib import blake2b
>>> h = blake2b()
>>> h.update(b'Hello world')
>>> h.hexdigest()
'6ff843ba685842aa82031d3f53c48b66326df7639a63d128974c5c14f31a0f33...'

키드 해싱(키 인증) 예시:

>>> from hashlib import blake2b
>>> h = blake2b(key=b'pseudorandom key', digest_size=16)
>>> h.update(b'message data')
>>> h.hexdigest()
'3d363ff7401e02026f4a4687d4863ced'

참고

  • 모듈 hmac — 해시를 사용해 메시지 인증 코드를 생성하는 모듈.
  • 모듈 base64 — 비바이너리 환경을 위해 바이너리 해시를 인코딩하는 또 다른 방법.

더 알아보기 (Learn more)