Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonでデータを暗号化・復号化する方法|cryptographyライブラリの使い方を解説

このチュートリアルでは、Pythonのcryptographyライブラリを使用して、文字列などのデータを暗号化・復号化する方法を解説します。

暗号化とは、情報を許可された相手だけがアクセスできる形に変換するプロセスのことです。第三者に見られたくない機密性の高いデータを安全に保護するために欠かせない技術であり、パスワードや個人情報、APIキーなどの取り扱いにおいて重要な役割を果たします。

  • 暗号化の基礎知識

本記事では対称鍵暗号方式(共通鍵暗号方式)を採用します。これは、データの暗号化に使用した鍵と同じ鍵で復号化も行えるシンプルな方式です。

ここで使用するcryptographyライブラリのFernetクラスは、AESアルゴリズム(AES-128-CBC)をベースに、HMAC-SHA256による改ざん検知機能を組み合わせた安全な仕組みを提供しています。

Pythonでデータを暗号化する

まず、cryptographyライブラリをインストールしましょう。

pip3 install cryptography

次に、cryptographyライブラリからFernetをインポートし、鍵を生成します。この鍵は対称暗号化・復号化の両方に必要となる、最も重要な要素です。

鍵を生成する

鍵を生成するには、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)

このメソッドを実行するのは一度だけでOKです。生成した鍵は「secret.key」というファイルに保存されます。

注意: 生成した鍵は必ず安全な場所に保管してください。鍵を紛失すると、その鍵で暗号化されたデータは二度と復号化できなくなります。

鍵を読み込む

鍵を生成したら、データを暗号化する際にその鍵を読み込みます。

def load_key():
    """
    カレントディレクトリから `secret.key` を読み込む
    """
    return open("secret.key", "rb").read()

メッセージを暗号化する

これでメッセージを暗号化する準備が整いました。手順は以下の3ステップです。

  • 1. メッセージをエンコードする
  • 2. Fernetクラスを初期化する
  • 3. エンコードしたメッセージをencrypt()メソッドに渡す

1. メッセージをエンコードする:

message = "message I want to encrypt".encode()

2. Fernetクラスを初期化する:

f = Fernet(key)

3. メッセージを暗号化する:

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

decode()を呼び出すことで、バイト列が元の読める文字列に戻っていることが確認できます。

まとめ

本記事では、PythonのcryptographyライブラリとFernetクラスを使ったデータの暗号化・復号化の基本的な流れを学びました。

  • Fernet.generate_key()で鍵を生成し、安全な場所に保存する
  • 暗号化はencrypt()、復号化はdecrypt()メソッドで行う
  • 鍵を紛失するとデータを復元できないため、管理には十分注意する

Fernetは認証付き暗号化を提供しているため、改ざん検知も自動的に行われます。実際のアプリケーションでは、鍵をハードコードせず環境変数やシークレットマネージャーで管理するなど、運用面のセキュリティにも配慮しましょう。

  1. Pythonとscikit-learn(scikit-image)ライブラリで画像を読み込み・表示する方法を解説

    データの前処理とはデータの前処理とは、データのクリーニング、無効なデータやノイズの除去、適切な値への置き換えなどを行う作業のことです。前処理の対象はテキストデータだけとは限らず、画像や動画の処理も含まれます。データの前処理とは、端的に言えば、さまざまなリソース(または単一のリソース)から収集したすべてのデータを、共通のフォーマットや均一なデータセットにまとめるタスクです。実世界のデータは決して理想的な状態ではないため、欠損セルやエラー、外れ値、列間の不整合などの問題が含まれている可能性があります。画像の場合も同様で、正しく配置されていなかったり、ぼやけていたり、サイズが非常に大きかったりするこ

  2. Pythonの「seaborn」ライブラリを使用してデータを視覚的に表現するにはどうすればよいですか?

    機械学習とデータ可視化の関係機械学習とは、データからモデルを構築し、まだ見たことのないデータに対しても汎化できるようにすることを目的とした技術です。機械学習モデルに入力するデータは、システムが正しく理解できる形である必要があります。それによって、モデルはデータを適切に解釈し、精度の高い結果を生成できるようになります。Seabornとは何かSeabornは、データの可視化を支援するPythonライブラリです。あらかじめカスタマイズされた美しいテーマと高水準インターフェースを備えており、このインターフェースを活用することで、扱うデータの種類や、フィルタを適用した際の挙動を柔軟にカスタマイズ・制御す