이 튜토리얼에서는 Python의 cryptography 라이브러리를 사용하여 문자열과 같은 데이터를 암호화하고 복호화하는 방법을 알아봅니다.
암호화(Encryption)는 정보를 인가된 당사자만 접근할 수 있도록 인코딩하는 과정입니다. 이를 통해 아무나 열람하거나 접근해서는 안 되는 데이터를 안전하게 보호할 수 있습니다.
대칭 키 암호화란?
이 예제에서는 대칭 키 암호화(symmetric encryption) 방식을 사용합니다. 대칭 키 암호화는 데이터를 암호화할 때 사용한 동일한 키로 복호화도 가능한 방식을 의미합니다.
여기서 사용하는 cryptography 라이브러리는 AES 알고리즘을 기반으로 구축되어 있으며, Fernet 클래스를 통해 손쉽게 활용할 수 있습니다.
Python에서 데이터 암호화하기
1. 라이브러리 설치
먼저 cryptography 라이브러리를 설치합니다:
pip3 install cryptography
다음으로 cryptography 라이브러리에서 Fernet을 임포트하고 키(key)를 생성합니다. 이 키는 대칭 방식의 암호화 및 복호화에 반드시 필요합니다.
2. 키 생성하기
generate_key() 메서드를 호출하여 키를 생성합니다:
from cryptography.fernet import Fernet
def generate_key():
"""
키를 생성하고 파일로 저장합니다.
"""
key = Fernet.generate_key()
with open("secret.key", "wb") as key_file:
key_file.write(key)
키 생성은 위 메서드를 딱 한 번만 실행하면 됩니다.
주의: 생성된 키는 반드시 안전한 곳에 보관해야 합니다. 키를 분실하면 해당 키로 암호화된 데이터를 더 이상 복호화할 수 없습니다.
3. 키 불러오기
키를 생성했다면, 데이터를 암호화하기 위해 코드에서 해당 키를 불러와야 합니다:
def load_key():
"""
현재 디렉터리에서 `secret.key` 파일을 읽어 반환합니다.
"""
return open("secret.key", "rb").read()
4. 메시지 암호화하기
이제 메시지를 암호화할 준비가 되었습니다. 암호화는 다음 세 단계로 진행됩니다:
- 1단계 – 메시지를 인코딩(bytes)합니다.
- 2단계 – Fernet 클래스를 초기화합니다.
- 3단계 – 인코딩된 메시지를
encrypt()메서드에 전달합니다.
메시지 인코딩:
message = "message I want to encrypt".encode()
Fernet 클래스 초기화:
f = Fernet(key)
메시지 암호화:
encrypted_message = f.encrypt(message)
전체 코드 예제
다음은 Python에서 메시지를 암호화하는 완전히 동작하는 전체 예제입니다:
from cryptography.fernet import Fernet
def generate_key():
"""
키를 생성하고 파일로 저장합니다.
"""
key = Fernet.generate_key()
with open("secret.key", "wb") as key_file:
key_file.write(key)
def load_key():
"""
이전에 생성한 키를 불러옵니다.
"""
return open("secret.key", "rb").read()
def encrypt_message(message):
"""
메시지를 암호화합니다.
"""
key = load_key()
encoded_message = message.encode()
f = Fernet(key)
encrypted_message = f.encrypt(encoded_message)
print(encrypted_message)
if __name__ == "__main__":
encrypt_message("encrypt this message")
실행 결과:
b'gAAAAABesCUIAcM8M-_Ik_-I1-JD0AzLZU8A8-AJITYCp9Mc33JaHMnYmRedtwC8LLcYk9zpTqYSaDaqFUgfz-tcHZ2TQjAgKKnIWJ2ae9GDoea6tw8XeJ4='
Python에서 데이터 복호화하기
메시지를 복호화하려면 Fernet 라이브러리의 decrypt() 메서드를 호출하면 됩니다. 단, 복호화에도 키가 필요하므로 마찬가지로 키를 먼저 불러와야 한다는 점을 기억하세요.
from cryptography.fernet import Fernet
def load_key():
"""
이전에 생성한 키를 불러옵니다.
"""
return open("secret.key", "rb").read()
def decrypt_message(encrypted_message):
"""
암호화된 메시지를 복호화합니다.
"""
key = load_key()
f = Fernet(key)
decrypted_message = f.decrypt(encrypted_message)
print(decrypted_message.decode())
if __name__ == "__main__":
decrypt_message(b'gAAAAABesCUIAcM8M-_Ik_-I1-JD0AzLZU8A8-AJITYCp9Mc33JaHMnYmRedtwC8LLcYk9zpTqYSaDaqFUgfz-tcHZ2TQjAgKKnIWJ2ae9GDoea6tw8XeJ4=')
실행 결과:
encrypt this message
마무리
이처럼 Python의 cryptography 라이브러리와 Fernet 클래스를 활용하면 몇 줄의 코드만으로도 AES 기반의 강력한 대칭 키 암호화를 손쉽게 구현할 수 있습니다. 핵심은 키를 안전하게 보관하는 것이며, 키가 유출되거나 분실되지 않도록 관리하는 것이 무엇보다 중요합니다.