こんにちは、アメンボです。この記事では、ウェブアプリケーションフレームワーク、djangoで簡単にフィールドの値を暗号化してデータベースへ保存する機能を実装する方法について説明します。
はじめに
djangoはウェブアプリケーションを作るのに非常に高機能なフレームワークです。標準機能だけでも、一通りのウェブアプリケーションを作ることはできますが、保存しているデータベースが流出した場合にも機密情報が保護できるよう、データを暗号化する必要があり、調べていたところ見つけたので記事にしようと思います。
一通りウェブを検索すると、暗号化方式についてはいろいろ出てきますが、ここでいくつか調べたパッケージのうち、比較的暗号化強度の強くて、セキュアものを使用しているdjango-secured-fieldsパッケージについて紹介します。
暗号化方式について
ここで使用するのは、AES(共通鍵)暗号化方式です。また、パッケージを使用した簡単な暗号化方式について説明をする記事となっています。しっかりとした暗号化を行うには、暗号化方式などについての理解が必要となります。あくまでもここではデータベースに保存をするデータの簡単な暗号化について説明をしているものとなりますので、しっかりとした暗号化については、下記などを確認し理解するようにしてください。
django-secured-fields パッケージを利用する
djang-secured-fieldsパッケージを使用すると、フィールドの暗号化が簡単に実装できます。
まず、pipでdjango-secured-fieldsをインストールします。
(venv) > pip install django-secured-fields
次に暗号化のためのキーを生成します。
(venv) > python manage.py generate_key
ここで生成したキーを設定ファイルに記載します。
settings.py
SECURED_FIELDS_KEY = “5yGLsv_gc6sP8miFLCFbDcE72wmGMdrBf_AnEU37dWE=”
※キーを設定ファイルに直接記載するのは推奨されません。環境変数として渡す場合は、.envに記載をしたうえで下記のように記載します。
SECURED_FIELDS_KEY = os.environ.get("SECURED_FIELDS_KEY")
あとは、暗号化したいフィールドをmodels.pyで定義したうえで、マイグレーションすれば完了です。
models.py
import secured_fields 追記
encrypted_field = secured_fields.EncryptedCharField(null=True, searchable=True)
(venv) > python manage.py makemigrations
(venv) > python manage.py migrate
実際に登録されたデータを確認すると、longtextフィールドにテキストが暗号化されて入力されています。
mysql > select encrypted_field from table
gAAAAABmpkUWq-InPzYi3OOhVwu3tMR1rGCkSnW3E8phRLJAI1KpRrkEwtT07nJJXxMk0276CmP4zZ10YceVpcHTayUpVdp3IA==$e836b0fb5dba792b0ed595b319ac4b33657654cd7dd51384d73e0bf3c6a4c139
データベース上は暗号化されていますが、djangoのシステムからは平文で確認することができます。