Overview
デジタル署名(Digital Signature)とは、公開鍵暗号技術を利用して、電子データの作成者の本人性(認証)とデータ内容の改ざんがないこと(完全性)を暗号学的に保証する仕組みです。紙文書における署名や印鑑に相当するもので、法的な効力も認められています。
署名の作成には秘密鍵を使用し、検証には対応する公開鍵を使用します。まず対象データのハッシュ値を計算し、そのハッシュ値を秘密鍵で暗号化したものがデジタル署名です。検証者は公開鍵で署名を復号してハッシュ値を取り出し、データから再計算したハッシュ値と一致するかを確認します。
デジタル署名は否認防止(Non-repudiation)の機能も提供します。署名者のみが秘密鍵を保持しているため、署名の事実を後から否認することができません。これにより、電子商取引や電子政府における法的証拠としても機能します。
Details
デジタル署名の仕組み
デジタル署名の生成と検証は以下のプロセスで行われます:
- 署名生成:(1) 対象データのハッシュ値を計算 → (2) ハッシュ値を署名者の秘密鍵で暗号化 → (3) 暗号化されたハッシュ値が「デジタル署名」となる
- 署名検証:(1) デジタル署名を署名者の公開鍵で復号しハッシュ値を取得 → (2) データから同じハッシュアルゴリズムでハッシュ値を再計算 → (3) 両者が一致すれば署名は有効
主な署名アルゴリズム
- RSA署名(RSASSA-PSS):RSA暗号を基盤とした署名方式。PSSパディングが現在の推奨
- ECDSA:楕円曲線暗号ベースの署名方式。RSAより短い鍵長で同等の安全性。ビットコインで使用
- EdDSA(Ed25519/Ed448):楕円曲線Edwards曲線に基づく高速な署名方式。SSHやTLSで採用拡大中
- DSA:離散対数問題に基づく署名方式。NISTが2023年に非推奨化を発表
電子署名法と法的効力
日本では2001年施行の電子署名法により、一定の要件を満たす電子署名は手書き署名や押印と同等の法的効力を持つことが認められています。認定認証業務による電子証明書を使用した署名は、裁判における証拠としても有効です。
EUではeIDAS規則(2014年)により、適格電子署名(QES)は加盟国間で相互承認される法的枠組みが整備されています。
コードサイニング
コードサイニング(Code Signing)は、ソフトウェアの開発者がプログラムにデジタル署名を付与する仕組みです。OSはインストール時に署名を検証し、正当な開発者によるものか、インストール後に改ざんされていないかを確認します。AppleのGatekeeperやMicrosoftのSmartScreenは、署名のないプログラムに警告を表示します。
タイムスタンプ署名
デジタル署名にタイムスタンプを付与することで、「ある時点でデータが存在し、それ以降改ざんされていない」ことを証明できます。信頼できる第三者機関(TSA:Time Stamping Authority)がタイムスタンプを発行し、法的証拠保全や知的財産の先使用権証明などに活用されています。
Security Measures
- 01安全な署名アルゴリズムの選択:EdDSA(Ed25519)またはECDSA(P-256以上)を推奨します。RSA署名を使用する場合はPSSパディングと2048ビット以上の鍵長を使用してください。SHA-1ベースの署名は廃止済みです。
- 02秘密鍵の厳格な保管:署名用秘密鍵はHSMやスマートカードに保管し、物理的なアクセス制御と多要素認証を適用してください。特にコードサイニング証明書の秘密鍵が漏洩すると、マルウェアに正規の署名が付与される危険があります。
- 03タイムスタンプの付与:長期保存が必要な電子文書やコードサイニングにはタイムスタンプを付与してください。署名証明書の有効期限後も、タイムスタンプにより署名の有効性を維持できます。
- 04署名検証の実装:受信側で署名検証を確実に実施してください。署名の検証を省略したり、検証エラーを無視するコードは重大な脆弱性となります。証明書チェーンの検証と失効確認も必須です。
- 05鍵の定期ローテーション:署名鍵は定期的に更新し、旧鍵で署名されたデータの検証が引き続き可能な移行期間を設けてください。
Incidents
📋 Stuxnet — 盗まれたコードサイニング証明書(2010年)
イランの核施設を標的とした高度なマルウェアStuxnetは、Realtek SemiconductorおよびJMicron Technologyから盗まれた正規のコードサイニング証明書で署名されていました。正規の署名が付与されていたため、Windowsのセキュリティチェックを回避し、ドライバとして正常にインストールされました。この事件は、コードサイニング証明書の秘密鍵管理がいかに重要かを示す象徴的な事例です。
📋 SolarWinds サプライチェーン攻撃(2020年)
2020年12月に発覚したSolarWinds攻撃では、正規のビルドプロセスにバックドアが挿入され、正規のコードサイニング証明書で署名されたアップデートとして約18,000の組織に配布されました。正規の署名が付与されていたため、セキュリティ製品の検知を回避し、米国政府機関を含む多数の組織が被害を受けました。ビルドパイプラインのセキュリティ確保の重要性を示した事件です。
📋 NVIDIA コードサイニング証明書の漏洩(2022年)
2022年3月、ハッカー集団Lapsus$がNVIDIAのシステムに侵入し、コードサイニング証明書を含む大量のデータを窃取・公開しました。漏洩した証明書は即座にマルウェアの署名に悪用され、正規のNVIDIAドライバに偽装したマルウェアが拡散しました。NVIDIAは該当証明書を失効させましたが、Windows上での証明書失効チェックの不完全さから、一部環境では偽装ドライバが動作し続けました。