[파이썬] 암호화와 해시의 차이점

암호화와 해시는 데이터 보안과 관련된 중요한 개념이지만, 둘은 서로 다른 목적과 방식을 가지고 있습니다. 이번 글에서는 암호화와 해시의 차이점을 살펴보고, 파이썬에서 이를 구현하는 방법에 대해 알아보겠습니다.

암호화 (Encryption)

암호화는 평문을 암호화된 형태로 변환하는 과정을 의미합니다. 이 때 사용되는 암호화 알고리즘은 보안을 위해 다양하게 설계되었으며, 주로 대칭키 암호화와 공개키 암호화가 사용됩니다.

파이썬에서 암호화를 구현하기 위해서는 cryptography 라이브러리를 사용할 수 있습니다. 예제 코드를 통해 대칭키 암호화와 공개키 암호화를 간단히 살펴보겠습니다.

from cryptography.fernet import Fernet
from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding

# 대칭키 암호화
key = Fernet.generate_key()
cipher_suite = Fernet(key)
encrypted_text = cipher_suite.encrypt(b"Hello, World!")
decrypted_text = cipher_suite.decrypt(encrypted_text)

print("Encrypted Text:", encrypted_text)
print("Decrypted Text:", decrypted_text)

# 공개키 암호화
private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048
)
public_key = private_key.public_key()

message = b"Hello, World!"
ciphertext = public_key.encrypt(
    message,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)
plaintext = private_key.decrypt(
    ciphertext,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)

print("Ciphertext:", ciphertext)
print("Plaintext:", plaintext)

해시 (Hashing)

해시는 입력 데이터를 고정된 길이의 고유한 값으로 변환하는 과정을 의미합니다. 이 고유한 값은 해시 함수에 의해 생성되며, 동일한 입력은 항상 동일한 해시값을 갖습니다. 해시는 데이터 무결성을 검증하는데 사용되며, 비밀번호 저장, 메시지 무결성 체크 등 다양한 분야에서 활용됩니다.

import hashlib

# 단방향 해시
message = "Hello, World!"
hash_object = hashlib.sha256(message.encode())
hash_value = hash_object.hexdigest()

print("Hash Value:", hash_value)

암호화와 해시는 서로 다른 목적과 방식을 가지고 있습니다. 암호화는 데이터의 기밀성과 안전한 통신을 위해 사용되며, 대칭키 암호화와 공개키 암호화가 주로 사용됩니다. 반면, 해시는 데이터의 무결성을 검증하는데 사용되며, 단방향 해시 함수를 통해 입력 값을 고유한 해시값으로 변환합니다.