セキュリティ対策の基本 #4 【デジタル署名とPKI】(覚え書き)

セキュリティ

インターネットでの電子取引や電子申請が普及する今、デジタルな世界を安全に保つための「電子署名」と「PKI(公開鍵基盤)」は大活躍。
この仕組みを使えば、誰が文書に責任を持っているのか確認でき、内容が改ざんされていないか検証できるんです。では、さっそくその仕組みと役割を見ていきましょう!

なぜ電子署名とPKIが必要なの?

改ざん防止・なりすまし防止
インターネット上の取引や申請で大切なのは「内容が変えられていない」「本物の送信者から送られてきた」という保証です。

・否認防止
一度送信した証拠として、後から「送っていない」と否定できないようにします。

・PKIの役割
公開鍵暗号方式により、各ユーザの公開鍵が本物であることを第三者機関(認証局)が証明。これにより信頼性が確立されます。

電子署名ってどういう仕組み?

電子署名は、手書きのサインのデジタル版と考えるとイメージしやすいです。
ポイントは2つ!

  1. ハッシュ関数で文書から短い固定長の「ハッシュ値」を作成
  2. そのハッシュ値を送信者の秘密鍵で暗号化(=署名)

こうすることで、受信者は送信者の公開鍵を使って署名を検証し、「本当に送ったのはあの人か」「途中で改ざんされていないか」をチェックできます。

ハッシュ関数の不思議な世界

ハッシュ関数は、どんな長さのデータからも一定サイズの値を作り出す魔法のような関数。
特徴:

  • 一方向性:出力から元の入力を復元するのはほぼ不可能!
  • 衝突耐性:異なるデータが同じハッシュ値になりにくい

Pythonでハッシュ関数を体験!

以下のコードは、Pythonの標準ライブラリを使って文字列のSHA-1ハッシュ値を計算する例です。

import hashlib

# ハッシュ化するメッセージ
message = b"Hello, Digital Signature!"

# SHA-1ハッシュ値を計算
sha1_hash = hashlib.sha1(message).hexdigest()

print("SHA-1 hash:", sha1_hash)

このコードを実行すると、メッセージのハッシュ値が出力されます。もしデータが改ざんされていれば、計算されるハッシュ値も変わってしまうので、整合性確認に役立ちます!

電子署名の実際の動き

電子署名は「ハッシュ値を秘密鍵で暗号化」することで作られます。
例えば、A社が発注書に署名する場合、次のような流れです。

  1. 発注書の内容からハッシュ値を計算
  2. A社の秘密鍵でそのハッシュ値を暗号化(=電子署名の作成)
  3. 受信者はA社の公開鍵で署名を復号し、ハッシュ値を再計算して照合

Pythonで電子署名を実装してみよう!

次のコードは、RSAを使って電子署名を生成し、検証する例です。(※このコードを実行するにはcryptographyライブラリが必要です。)

from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding, rsa

# RSA鍵ペアの生成(秘密鍵と公開鍵)
private_key = rsa.generate_private_key(public_exponent=65537, key_size=2048)
public_key = private_key.public_key()

message = b"Important message for digital signature!"

# 電子署名の生成:秘密鍵でメッセージに署名
signature = private_key.sign(
    message,
    padding.PSS(
        mgf=padding.MGF1(hashes.SHA256()),
        salt_length=padding.PSS.MAX_LENGTH
    ),
    hashes.SHA256()
)

print("Signature:", signature)

# 署名の検証:公開鍵で署名を確認
public_key.verify(
    signature,
    message,
    padding.PSS(
        mgf=padding.MGF1(hashes.SHA256()),
        salt_length=padding.PSS.MAX_LENGTH
    ),
    hashes.SHA256()
)
print("Signature verified!")

このコードは、まずRSA鍵ペアを生成し、メッセージに対して電子署名を作成。その後、公開鍵を使って署名の正当性を確認する流れを示しています。これにより、送信者が実際にメッセージを送信し、改ざんがないことが証明されます!

PKI(公開鍵基盤)とは?

PKIは、電子署名の信頼性を保証するためのインフラストラクチャです。
主な構成要素:

  • 認証局(CA)
    公開鍵証明書を発行し、ユーザの公開鍵が本物であることを保証します。
  • 登録局(RA)
    ユーザの登録や資格審査を担当し、証明書発行の依頼を認証局に伝えます。
  • 検証局(VA)
    証明書や失効リストを管理し、利用者に提供します。

また、公開鍵証明書はX.509規格に沿っており、証明書にはバージョン番号、シリアル番号、発行者、対象者、公開鍵、そして署名などの情報が含まれています。

電子認証局の相互認証モデル

複数の認証局が連携して信頼のパス(トラストパス)を構築する仕組みも存在します。
主なモデル:

  • 階層型信頼モデル
    ルート認証局がすべての下位認証局を保証するシンプルな構造。
  • 相互認証型信頼モデル
    異なる認証局同士がお互いに証明書を発行し合い、相互の信頼関係を構築するモデル。
  • ブリッジ認証型
    複数の認証局が中間のブリッジ認証局を介して連携するモデル。

これにより、たとえ異なる組織間であっても、互いの公開鍵証明書の正当性を確認できるようになっています。

まとめ

  • 電子署名は、文書の改ざん検知や送信者の確認を可能にし、否認防止の役割を果たします。
  • ハッシュ関数は、データの整合性チェックのための重要なツールです。
  • PKIは、認証局を中心に公開鍵の正当性を保証し、インターネット上のセキュリティを支える基盤です。
  • Pythonを使えば、ハッシュ計算やデジタル署名の生成・検証といった技術を手軽に体験できます!

デジタルな世界でのセキュリティは、複雑な仕組みが連携して成り立っていますが、今回の解説でその基本的な部分を楽しく学んでもらえたなら嬉しいです。ぜひ、自分でもコードを実行して、セキュリティの魔法を体験してみてください!

コメント