6

現在、テーブルに入る途中でデータを自動的に暗号化EncryptedTypesqlalchemy_utils、テーブルからデータを取得するときにデータを復号化するために、定義済みの文字列を暗号化キーとして使用します。これは正常に機能しますが、要件が変更されたため、テーブルに入る途中でデータを暗号化する必要がありますが、データを取得するときに暗号化を維持する必要があります。これがEncryptedTypeサポートされているかどうか、または暗号化ライブラリであると思われるものに自分でロールバックせずに SQLAlchemy を使用してこれを行う他の方法があるかどうかはわかりません。

私のテーブルの例:

class MyTable(db.Model):
    __tablename__ = "my_table"
    id = db.Column(db.Integer, primary_key=True, autoincrement="auto")
    name = db.Column(db.String(50), nullable=False)
    username = db.Column(EncryptedType(db.String, _key), nullable=True)
    password = db.Column(EncryptedType(db.String, _key), nullable=True)
4

1 に答える 1

4

ここでは、暗号化を処理するために使用する暗号化ライブラリをEncryptedType使用することが最も簡単な解決策であることがわかりました。

モデル クラスにメソッドを追加し、__init__そこで暗号化を処理しました。

from cryptography.fernet import Fernet
key = "my_encryption_key_here"

class MyTable(db.Model):
    __tablename__ = "my_table"
    id = db.Column(db.Integer, primary_key=True, autoincrement="auto")
    name = db.Column(db.String(50), nullable=False)
    username = db.Column(EncryptedType(db.String, _key), nullable=True)
    password = db.Column(EncryptedType(db.String, _key), nullable=True)
    auth_password = db.Column(EncryptedType(db.String, _key), nullable=True)

    def __init__(self, name, username, password, auth_password):
        cipher_suite = Fernet(key)
        self.name = name
        self.username = cipher_suite.encrypt(bytes(username))
        self.password = cipher_suite.encrypt(bytes(password))
于 2018-03-29T17:43:54.597 に答える