Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python으로 MD5 해시 생성하기 – hashlib 모듈 완벽 가이드

데이터 보안은 모든 IT 기업이 가장 중요하게 여기는 핵심 과제입니다. 데이터를 보호하고 무결성을 검증하기 위해 다양한 해싱(Hashing) 기법이 활용되고 있습니다.

해시(Hash)란 무엇인가?

해시는 가변 길이의 바이트 시퀀스를 입력받아 고정 길이의 시퀀스로 변환하는 함수입니다. 다만, 해시된 값에서 원본 데이터(입력 바이트)를 되돌려 얻는 것은 사실상 불가능에 가깝습니다. 예를 들어 입력값을 x, 해시 함수를 f라고 할 때 f(x)를 계산하는 것은 빠르고 간단하지만, 그 결과로부터 다시 x를 복원하는 것은 매우 어렵고 시간이 오래 걸리는 작업입니다.

해시 함수의 반환값은 해시(hash), 체크섬(checksum), 해시 값(hash value), 메시지 다이제스트(message digest) 등으로 불립니다.

위 내용을 요약하면 다음과 같습니다.

Python으로 MD5 해시 생성하기 – hashlib 모듈 완벽 가이드

예를 들어 "Hello World"라는 메시지를 MD5 해시 함수로 변환하면 다음과 같은 결과가 나옵니다.

Python으로 MD5 해시 생성하기 – hashlib 모듈 완벽 가이드

실무에서는 해시 함수가 암호화 알고리즘, 디지털 서명, 지문(fingerprint), 비밀번호 저장 등 다양한 분야에서 폭넓게 사용됩니다. Python 개발자 입장에서도 데이터나 파일의 중복 여부 확인, 공개 네트워크를 통해 데이터를 전송할 때의 무결성 검증, 데이터베이스에 비밀번호 저장 등에 해시 함수가 필요합니다.

대표적인 해시 알고리즘 두 가지

  • MD5 – MD5(Message Digest Algorithm 5)는 128비트 해시 값을 생성합니다. 몇 가지 보안 취약점이 발견되어 현재는 주로 데이터 무결성 검사 용도로 사용됩니다.
  • SHA – SHA(Secure Hash Algorithm) 계열에는 여러 알고리즘이 있으며, 미국 연방 정보 처리 표준(FIPS)에 따라 개발되었습니다. MD5보다 훨씬 안전하여 암호화 응용 프로그램을 포함한 다양한 분야에서 널리 사용됩니다. 이 알고리즘들이 생성하는 메시지 크기는 160비트부터 512비트까지 다양합니다.

Python의 hashlib 모듈

Python 표준 라이브러리에는 대중적인 해싱 알고리즘 대부분을 담고 있는 hashlib 모듈이 포함되어 있습니다. 대부분의 알고리즘이 hashlib 모듈 내부에 구현되어 있으며, OpenSSL이 설치되어 있다면 OpenSSL이 제공하는 알고리즘도 함께 사용할 수 있습니다.

먼저 해싱 알고리즘을 사용하려면 hashlib 모듈을 임포트합니다.

import hashlib

그다음, hashlib 모듈에서 현재 사용 가능한 알고리즘 목록을 확인해 보겠습니다.

>>> print(hashlib.algorithms_available)
{'sha3_256', 'sha3_224', 'sha1', 'blake2b', 'sha512', 'dsaEncryption', 'dsaWithSHA', 'DSA', 'md5', 'sha384', 'sha224', 'sha3_384', 'ecdsa-with-SHA1', 'DSA-SHA', 'SHA1', 'md4', 'SHA256', 'MD4', 'sha3_512', 'whirlpool', 'sha256', 'shake_256', 'SHA', 'RIPEMD160', 'shake_128', 'SHA512', 'ripemd160', 'SHA224', 'sha', 'blake2s', 'SHA384', 'MD5'}

위 목록은 OpenSSL을 통해 제공되는 알고리즘까지 포함한 것입니다.

반면, 어떤 환경에서든 항상 사용 가능한 알고리즘만 확인하려면 algorithms_guaranteed 속성을 사용하면 됩니다.

>>> print(hashlib.algorithms_guaranteed)
{'sha3_512', 'sha256', 'sha3_256', 'shake_256', 'sha3_224', 'sha1', 'blake2b', 'sha512', 'md5', 'shake_128', 'sha384', 'sha224', 'sha3_384', 'blake2s'}

MD5 해시 생성 코드

이제 MD5 알고리즘을 활용한 간단한 프로그램을 만들어 보겠습니다.

import hashlib
hash_obj = hashlib.md5(b'Hello, Python!')
print(hash_obj.hexdigest())

출력 결과

a0af7810eb5fcb84c730f851361de06a

위 코드는 "Hello, Python!" 문자열을 입력으로 받아 해당 문자열의 HEX 다이제스트를 출력합니다. hexdigest()는 해시를 나타내는 HEX 문자열을 반환합니다.

만약 바이트 시퀀스 형태의 결과가 필요하다면 hash_obj.digest()를 사용하면 됩니다.

import hashlib
hash_obj = hashlib.md5(b'Hello, Python!')
# 바이트 시퀀스 생성
print(hash_obj.digest())

출력 결과

b'\xa0\xafx\x10\xeb_\xcb\x84\xc70\xf8Q6\x1d\xe0j'

눈치챘겠지만, 문자열 리터럴 앞에 'b'를 붙였습니다. 이는 문자열로부터 바이트를 생성하기 위함이며, 해시 함수는 매개변수로 바이트 시퀀스만 받아들이기 때문입니다.

콘솔에서 문자열을 직접 입력받아 처리하려면, 반드시 문자열을 바이트 시퀀스로 인코딩해야 합니다.

import hashlib
mystring = input('Enter string to hash: ')
hash_obj = hashlib.md5(mystring.encode())
print(hash_obj.hexdigest())

출력 결과

Enter string to hash: Hello, TutorialsPoint
9a5d3fad65690dcf44adaec67226abe7

마무리 및 보안 참고 사항

MD5는 학습 목적이나 파일 무결성 검증에는 유용하지만, 충돌(collision) 취약점이 알려져 있어 비밀번호 저장처럼 보안이 중요한 용도로는 권장되지 않습니다. 실제 서비스를 개발할 때는 SHA-256 같은 SHA-2 계열 알고리즘 또는 bcrypt, Argon2 같은 전용 비밀번호 해싱 라이브러리를 사용하는 것이 훨씬 안전합니다.