파이썬 hashlib 라이브러리는 해시 함수들을 구현한 모듈입니다. 다양한 해시 알고리즘을 지원합니다.
“파이썬 hashlib”에서 사용 가능한 해시 알고리즘 확인
hashlib
모듈은 현재 시스템에서 사용 가능한 해시 알고리즘을 확인할 수 있습니다.
import hashlib
algorithms = hashlib.algorithms_available
print("Available algorithms:", algorithms)
Available algorithms: {'sha512_256', 'sha512', 'sha224', 'md5', 'sha384', 'blake2b', 'blake2s', 'sha3_384', 'sha256', 'sha3_512', 'sha1', 'md5-sha1', 'sm3', 'ripemd160', 'sha512_224', 'shake_128', 'sha3_256', 'sha3_224', 'shake_256'}
SHA-256 사용 예제
SHA-256은 보안적으로 강력한 해시 함수 중 하나입니다.
import hashlib
# 해싱할 데이터
data = "Hello, World!"
# hashlib을 사용하여 SHA-256으로 해싱
sha256_hash = hashlib.sha256(data.encode()).hexdigest()
print("Original Data:", data)
print("SHA-256 Hash:", sha256_hash)
Original Data: Hello, World!
SHA-256 Hash: dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f
encode()
메서드는 문자열을 바이트로 변환합니다.hexdigest()
메서드는 해시된 결과를 16진수 문자열 형태로 얻습니다. 이는 일반적으로 해시 값을 문자열로 표현할 때 사용됩니다:
솔트 구현 예제
해시에 솔트를 추가하여 보안을 강화할 수 있습니다
솔트 생성을 위해 secrets 모듈을 import 해줍니다.
import hashlib
import secrets # 솔트 생성을 위한 모듈
# 해싱할 데이터
password1 = "my_secure_password"
password2 = "my_secure_password"
# password1의 무작위 솔트 생성
salt1 = secrets.token_hex(16)
# 솔트와 비밀번호를 합쳐 해싱
salted_password1 = salt1 + password1
# password2의 무작위 솔트 생성
salt2 = secrets.token_hex(16)
# 솔트와 비밀번호를 합쳐 해싱
salted_password2 = salt2 + password2
hashed_password1 = hashlib.sha256(salted_password1.encode()).hexdigest()
hashed_password2 = hashlib.sha256(salted_password2.encode()).hexdigest()
print("Original Password1:", password1)
print("Salt1:", salt1)
print("Hashed Password1 with Salt:", hashed_password1)
print()
print("Original Password2:", password2)
print("Salt2:", salt2)
print("Hashed Password2 with Salt:", hashed_password2)
Original Password1: my_secure_password
Salt1: 7c661104a7e17c981d657e266ca4a0af
Hashed Password1 with Salt: 8182569040c81c5a9fc416b667d7777d2fcba10be347b2be5f0cadc62e79a897
Original Password2: my_secure_password
Salt2: 65305a75abe6a1692c49d337d1ab68f3
Hashed Password2 with Salt: 08b7f4831118a6bc9e74a3122ae32c83d563ff89f0e80af88b15c15f71809087
secrets.token_hex(16)
은 길이가 16인 무작위 16진수 문자열을 생성하는 코드입니다.
이 함수는 보안적으로 안전한 난수를 생성하여 사용자에게 예측이 불가능한 값을 제공합니다.
파일의 해시 예제
파일의 해시를 계산할 때는 파일을 작은 블록으로 나누어 해싱합니다.
import hashlib
def calculate_file_hash(file_path, block_size=65536):
sha256_hash = hashlib.sha256()
with open(file_path, "rb") as file:
for block in iter(lambda: file.read(block_size), b""):
sha256_hash.update(block)
return sha256_hash.hexdigest()
file_path = "example.txt"
file_hash = calculate_file_hash(file_path)
print(f"Hash of {file_path}: {file_hash}")
hash.update(data)
: 해시 객체에 추가 데이터를 업데이트합니다. 여러 번 호출될 수 있으며 각 호출은 이전 해시에 새로운 데이터를 더합니다.
파일 해싱시 블록 단위로 진행하는 이유
작은 블록으로 파일을 나누어 해싱하는 것은 효율성, 진행 상태 추적, 분할된 전송, 오류 감지 등 다양한 이점을 제공합니다.
메모리 효율성:
대부분의 파일은 크기가 매우 크기 때문에 전체 파일을 메모리에 로드하여 해싱하는 것은 효율적이지 않습니다. 작은 블록으로 나누면 각 블록을 순차적으로 처리하면서 메모리 소모를 최소화할 수 있습니다.
진행 상태 추적:
파일을 블록 단위로 나누면 각 블록에 대한 해시를 계산하면서 진행 상태를 추적하기가 더 쉽습니다. 특히 큰 파일의 경우 전체 해싱 작업이 오래 걸릴 수 있으므로 진행 상태를 추적하는 것은 사용자 경험을 향상시킵니다.
분할된 전송:
파일을 작은 블록으로 나누면 이 블록들을 여러 기기 또는 서버에 분할하여 동시에 전송할 수 있습니다. 이는 병렬 처리를 통해 전체 해싱 작업을 가속화할 수 있습니다.
오류 감지:
파일이 손상되었거나 일부 블록이 변경되었을 때, 작은 블록으로 나누어 각 블록에 대한 해시를 계산하면 변경된 블록을 쉽게 식별할 수 있습니다. 이는 데이터의 무결성을 검증하는 데 도움이 됩니다.
참고하면 좋은 글
hashlib — Secure hashes and message digests — Python 3.12.2 documentation