Files

59 lines
2.0 KiB
Python

import os
import base64
from cryptography.fernet import Fernet # type: ignore
from cryptography.hazmat.primitives import hashes # type: ignore
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC # type: ignore
def derive_key(password: str):
"""
.env에 설정된 ENCRYPTION_SEED를 솔트로 사용하여 사용자 비밀번호로부터 암호화 키를 파생합니다.
"""
seed = os.getenv('ENCRYPTION_SEED', 'default_secret_seed_123').encode()
kdf = PBKDF2HMAC(
algorithm=hashes.SHA256(),
length=32,
salt=seed,
iterations=100000,
)
key = base64.urlsafe_b64encode(kdf.derive(password.encode()))
return key
def encrypt_content(content: str, password: str):
"""지정된 비밀번호로 내용을 암호화합니다."""
key = derive_key(password)
f = Fernet(key)
encrypted_data = f.encrypt(content.encode()).decode()
return encrypted_data
def decrypt_content(encrypted_data: str, password: str):
"""지정된 비밀번호로 암호화된 내용을 복호화합니다."""
try:
key = derive_key(password)
f = Fernet(key)
decrypted_data = f.decrypt(encrypted_data.encode()).decode()
return decrypted_data
except Exception:
# 비밀번호가 틀리거나 데이터가 손상된 경우
return None
def get_master_key():
"""파일 암호화에 사용될 시스템 마스터 키를 생성합니다."""
seed = os.getenv('ENCRYPTION_SEED', 'master_default_seed_777')
return derive_key(seed)
def encrypt_file(data: bytes):
"""데이터를 시스템 마스터 키로 암호화합니다."""
key = get_master_key()
f = Fernet(key)
return f.encrypt(data)
def decrypt_file(data: bytes):
"""데이터를 시스템 마스터 키로 복호화합니다."""
try:
key = get_master_key()
f = Fernet(key)
return f.decrypt(data)
except Exception:
# 복호화 실패 (암호화되지 않은 파일이거나 키가 다름)
return None