[python] Peewee에서의 암호화 방법 비교

Peewee는 Python에서 사용할 수 있는 간단하고 가벼운 ORM(Object Relational Mapping) 라이브러리입니다. Peewee를 사용하여 데이터베이스 모델을 정의하고 데이터를 조회, 삽입, 업데이트, 삭제할 수 있습니다. 그러나 때로는 데이터베이스에 저장하는 암호화된 데이터가 필요할 수 있습니다. 이번 포스트에서는 Peewee에서 사용할 수 있는 암호화 방법을 비교해보겠습니다.

1. bcrypt를 사용한 암호화

bcrypt는 해시 함수와 함께 사용되는 단방향 암호화 함수입니다. Peewee에서는 BcryptPasswordMixin을 통해 bcrypt를 사용할 수 있습니다. 이 방법은 데이터베이스에 저장되는 암호를 안전하게 보호할 수 있으며, 매우 간단하게 구현할 수 있습니다.

from peewee import Model, CharField
from playhouse.bcrypt_ext import BcryptPasswordMixin

class User(Model, BcryptPasswordMixin):
    username = CharField()
    password = CharField()

    class Meta:
        database = db

# 암호 설정
user = User(username='john', password='password123')
user.set_password(user.password)

# 암호 검증
user.check_password('password123')  # True
user.check_password('wrongpassword')  # False

2. cryptography를 사용한 암호화

cryptography는 Python에서 암호화와 관련된 다양한 기능을 제공하는 라이브러리입니다. Peewee와 함께 사용할 때는 TextFieldBinaryField를 사용하여 암호화된 데이터를 저장하는 필드를 정의할 수 있습니다. 이 방법은 보다 복잡하지만 많은 암호화 알고리즘과 고급 기능을 지원합니다.

from peewee import Model, TextField, BinaryField
from cryptography.fernet import Fernet

# 암호화 키 생성
key = Fernet.generate_key()

class User(Model):
    username = TextField()
    password = BinaryField()

    def set_password(self, password):
        cipher_suite = Fernet(key)
        cipher_text = cipher_suite.encrypt(password.encode())
        self.password = cipher_text

    def check_password(self, password):
        cipher_suite = Fernet(key)
        plain_text = cipher_suite.decrypt(self.password).decode()
        return plain_text == password

    class Meta:
        database = db

# 암호 설정
user = User(username='john', password='')
user.set_password('password123')

# 암호 검증
user.check_password('password123')  # True
user.check_password('wrongpassword')  # False

결론

Peewee에서는 bcrypt와 cryptography를 통해 간편하게 데이터베이스에 암호화된 데이터를 저장할 수 있습니다. bcrypt는 단방향 암호화를 제공하며, 사용하기 쉽고 보안적으로 강력한 해시 함수입니다. 반면, cryptography는 다양한 암호화 알고리즘을 지원하며, 필요에 따라 고급 기능을 사용할 수 있습니다. 암호화 방법 선택은 데이터의 보안 요구사항과 개발자의 선호도에 따라 결정되어야 합니다.

참고 문서: