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

Python hashlib 활용 가이드: 해시와 메시지 다이제스트로 데이터 보안 구현하기


미국 연방 정보 처리 표준(FIPS)은 SHA1, SHA224, SHA256, SHA384, SHA512와 같은 안전 해시 알고리즘(Secure Hash Algorithm)을 정의합니다. RSA는 개발자인 Rivest, Shamir, Adleman 세 사람의 성씨 이니셜을 딴 약어로, MD5 알고리즘을 정의합니다. 과거에는 이러한 알고리즘들을 '메시지 다이제스트(message digest)'라고 불렀지만, 현대에는 '안전 해시(secure hash)'라는 용어가 일반적으로 사용됩니다.

Python의 hashlib 모듈은 다음과 같은 해시 알고리즘을 구현하는 데 사용됩니다.

  • md5
  • sha1
  • sha224
  • sha256
  • sha384
  • sha512

hashlib.new(name[, data]) — 범용 생성자

hashlib.new()는 원하는 알고리즘의 이름을 문자열로 첫 번째 매개변수로 받는 범용 생성자입니다. 위에 나열된 해시 알고리즘뿐만 아니라 시스템에 설치된 OpenSSL 라이브러리가 제공하는 다른 알고리즘에도 접근할 수 있습니다. 다만 new()보다 알고리즘별 named 생성자(예: hashlib.sha256())가 훨씬 빠르므로, 특별한 이유가 없다면 named 생성자를 사용하는 것이 좋습니다.

>>> hash = hashlib.new('md5', b'hello')
>>> hash.hexdigest()
'5d41402abc4b2a76b9719d911017c592'
>>> import hashlib

알고리즘별 named 생성자 사용하기

>>> msg = hashlib.sha256()
>>> msg.update(b'Simple is better than complex')
>>> msg.digest()
b'\xabz\xd8C(n\xb3\x8b\xf6\x0c\x0e\xf2\x81z\xd7\xf93\x835\xb2\xa1\x9cM\xb1S\x1f\xf7\xf9\x1av-F'
>>> msg.block_size
64
>>> msg.hexdigest()
'ab7ad843286eb38bf60c0ef2817ad7f9338335b2a19c4db1531ff7f91a762d46'
>>> msg = hashlib.md5()
>>> msg.update(b'Simple is better than complex')
>>> msg.hexdigest()
'fd34bb8fafd17f1a21d7bb6e38c8dc68'

해시 객체의 주요 메서드

해시 객체는 다음과 같은 메서드를 제공합니다.

update()바이트류(bytes-like) 객체로 해시 객체를 갱신합니다. m.update(a); m.update(b)는 m.update(a+b)와 동일하게 동작합니다.
digest()지금까지 update() 메서드에 전달된 데이터의 다이제스트를 반환합니다.
hexdigest()다이제스트를 16진수 숫자만 포함하는 두 배 길이의 문자열 객체로 반환합니다.
copy()해시 객체의 복사본을 반환합니다. 공통된 초기 부분 문자열을 공유하는 여러 데이터의 다이제스트를 효율적으로 계산할 때 유용합니다.

hashlib가 제공하는 주요 속성

algorithms_guaranteed이 모듈이 모든 플랫폼에서 지원이 보장되는 해시 알고리즘 이름들을 담은 집합(set)입니다.
algorithms_available현재 실행 중인 Python 인터프리터에서 실제로 사용할 수 있는 해시 알고리즘 이름들을 담은 집합입니다.
digest_size생성되는 해시 결과의 크기를 바이트 단위로 나타냅니다.
block_size해시 알고리즘의 내부 블록 크기를 바이트 단위로 나타냅니다.
name해당 해시의 정규화된(canonical) 이름으로, 항상 소문자이며 new() 함수의 매개변수로 사용해 같은 종류의 해시를 다시 만들 수 있습니다.

SHAKE: 가변 길이 다이제스트

shake_128()shake_256() 알고리즘은 가변 길이 다이제스트를 제공하며, length_in_bits//2에 해당하는 최대 128비트 또는 256비트 수준의 보안 강도를 지원합니다. 출력 길이를 직접 지정해야 하는 상황에서 유용하게 활용할 수 있습니다.

BLAKE2 해시 함수

BLAKE2는 RFC 7693에서 정의된 암호학적 해시 함수로, 두 가지 변형이 존재합니다.

  • BLAKE2b: 64비트 플랫폼에 최적화되어 있으며, 1바이트부터 64바이트까지 임의 크기의 다이제스트를 생성합니다.
  • BLAKE2s: 8~32비트 플랫폼에 최적화되어 있으며, 1바이트부터 32바이트까지 임의 크기의 다이제스트를 생성합니다.

참고: MD5와 SHA1은 충돌 공격(collision attack)에 취약한 것으로 알려져 있습니다. 따라서 비밀번호 저장, 전자 서명 등 보안이 중요한 용도에는 SHA256 이상의 알고리즘이나 BLAKE2를 사용하는 것이 권장됩니다.