파이썬 hashlib, secret : 파이썬 암호 해싱 라이브러리

파이썬 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

Leave a Comment

목차