Pythonでデジタル署名の生成と検証を行う方法

この記事では、Pythonを用いてデジタル署名の生成と検証を行う方法を詳細に解説します。具体的なコード例、その詳細な解説、および応用例を含めています。デジタル署名はデータの信頼性やデータの改竄を防ぐために重要な技術です。この記事で紹介する手法は、Pythonの標準ライブラリやサードパーティのライブラリを使用して、デジタル署名の生成と検証を簡単に行えるように設計されています。
目次

デジタル署名とは

デジタル署名は、電子文書やデータに対して、そのデータが改竄されていないこと、およびそのデータの送信者が確かであることを保証するための技術です。これにより、セキュリティが高まり、信頼性の確保が可能になります。

動作原理

デジタル署名の動作原理は大きく分けて2つのステップから成り立っています。
  • 生成:秘密鍵を使用して、データに署名を行います。
  • 検証:公開鍵を使用して、データと署名が正当であるかを検証します。
  • 必要なライブラリ

    この記事で使用するPythonのコードは以下のライブラリに依存しています。
  • Python 3.x
  • Cryptography
  • デジタル署名の生成

    最初にデジタル署名の生成について説明します。

    コード例

    from cryptography.hazmat.primitives import serialization, hashes
    from cryptography.hazmat.primitives.asymmetric import padding
    
    # 秘密鍵の読み込み
    with open("private_key.pem", "rb") as key_file:
        private_key = serialization.load_pem_private_key(
            key_file.read(),
            password=None,
        )
    
    # メッセージ
    message = b"Hello, world!"
    
    # 署名
    signature = private_key.sign(
        message,
        padding.PSS(
            mgf=padding.MGF1(hashes.SHA256()),
            salt_length=padding.PSS.MAX_LENGTH
        ),
        hashes.SHA256()
    )
    

    コードの解説

    このコードでは、`cryptography`ライブラリを使用しています。
  • 8~14行目: 秘密鍵をPEM形式で読み込んでいます。
  • 17行目: 署名するメッセージを指定しています。
  • 20~28行目: 秘密鍵を用いてデータに署名を行っています。
  • デジタル署名の検証

    コード例

    # 公開鍵の読み込み
    with open("public_key.pem", "rb") as key_file:
        public_key = serialization.load_pem_public_key(key_file.read())
    
    # 署名の検証
    try:
        public_key.verify(
            signature,
            message,
            padding.PSS(
                mgf=padding.MGF1(hashes.SHA256()),
                salt_length=padding.PSS.MAX_LENGTH
            ),
            hashes.SHA256()
        )
        print("署名が正当です。")
    except:
        print("署名が不正です。")
    

    コードの解説

    このコードでは以下の手順で署名を検証しています。
  • 3~7行目: 公開鍵をPEM形式で読み込んでいます。
  • 10~19行目: 公開鍵を用いて署名が正当かどうかを検証しています。
  • 20~23行目: 署名が正当か不正かを出力しています。
  • 応用例

    ファイルの完全性を確認する

    # ファイルからデータを読み込む
    with open("file.txt", "rb") as f:
        file_data = f.read()
    
    # ファイルのデータに対して署名を生成
    file_signature = private_key.sign(
        file_data,
        padding.PSS(
            mgf=padding.MGF1(hashes.SHA256()),
            salt_length=padding.PSS.MAX_LENGTH
        ),
        hashes.SHA256()
    )
    

    APIリクエストの署名

    import requests
    
    # APIに送信するデータ
    api_data = {"key": "value"}
    
    # APIデータに対して署名を生成
    api_signature = private_key.sign(
        str(api_data).encode(),
        padding.PSS(
            mgf=padding.MGF1(hashes.SHA256()),
            salt_length=padding.PSS.MAX_LENGTH
        ),
        hashes.SHA256()
    )
    
    # APIに署名付きでリクエストを送信
    response = requests.post("https://example.com/api", json={"data": api_data, "signature": api_signature.hex()})
    

    まとめ デジタル署名はデータの信頼性を確保するための重要な手段です。Pythonの`cryptography`ライブラリを使うことで、このようなデジタル署名の生成と検証が非常に簡単に行えます。特にファイルの完全性確認やAPIリクエストの署名など、多くの応用例が考えられます。

    コメント

    コメントする

    目次