암호화와 해시는 데이터 보안과 관련된 중요한 개념이지만, 둘은 서로 다른 목적과 방식을 가지고 있습니다. 이번 글에서는 암호화와 해시의 차이점을 살펴보고, 파이썬에서 이를 구현하는 방법에 대해 알아보겠습니다.
암호화 (Encryption)
암호화는 평문을 암호화된 형태로 변환하는 과정을 의미합니다. 이 때 사용되는 암호화 알고리즘은 보안을 위해 다양하게 설계되었으며, 주로 대칭키 암호화와 공개키 암호화가 사용됩니다.
-
대칭키 암호화 (Symmetric Encryption): 암호화와 복호화에 동일한 키를 사용하는 방식입니다. 데이터의 기밀성을 유지하기 위해 사용되며, 효율적인 암호화 방법입니다. 예를 들어, AES (Advanced Encryption Standard) 알고리즘이 대표적인 대칭키 암호화 알고리즘입니다.
-
공개키 암호화 (Asymmetric Encryption): 암호화와 복호화에 서로 다른 키를 사용하는 방식입니다. 데이터의 기밀성뿐만 아니라 인증과 안전한 통신을 위해 사용됩니다. 예를 들어, RSA (Rivest-Shamir-Adleman) 알고리즘이 대표적인 공개키 암호화 알고리즘입니다.
파이썬에서 암호화를 구현하기 위해서는 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)
해시는 입력 데이터를 고정된 길이의 고유한 값으로 변환하는 과정을 의미합니다. 이 고유한 값은 해시 함수에 의해 생성되며, 동일한 입력은 항상 동일한 해시값을 갖습니다. 해시는 데이터 무결성을 검증하는데 사용되며, 비밀번호 저장, 메시지 무결성 체크 등 다양한 분야에서 활용됩니다.
- 단방향 해시 (One-way Hashing): 입력 값을 해시값으로 변환하는 과정은 가능하지만, 해시값으로부터 입력 값을 역추적하는 것은 거의 불가능합니다. 대표적인 단방향 해시 함수로는 MD5, SHA-1, SHA-256 등이 있습니다. 파이썬의
hashlib
모듈을 사용하여 해시를 구현할 수 있습니다.
import hashlib
# 단방향 해시
message = "Hello, World!"
hash_object = hashlib.sha256(message.encode())
hash_value = hash_object.hexdigest()
print("Hash Value:", hash_value)
암호화와 해시는 서로 다른 목적과 방식을 가지고 있습니다. 암호화는 데이터의 기밀성과 안전한 통신을 위해 사용되며, 대칭키 암호화와 공개키 암호화가 주로 사용됩니다. 반면, 해시는 데이터의 무결성을 검증하는데 사용되며, 단방향 해시 함수를 통해 입력 값을 고유한 해시값으로 변환합니다.