『パスキー(Passkey)でパスワードレスログインができるようになった』『ブロックチェーンは改ざんできない』といった話題を聞いたことがあるでしょうか。
これらの裏側では、「デジタル署名(電子署名)」 という暗号技術が大活躍しています。
この記事では、暗号技術の専門家ではないエンジニアや初学者の方に向けて、数式を使わずに「デジタル署名とは何か?」「その技術の中で何が行われているのか?」をわかりやすく解説します。
前提知識:「鍵ペア」の考え方
デジタル署名を理解するうえで、「秘密鍵」と「公開鍵」のペアという考え方を知っておく必要があります。これは公開鍵暗号方式と呼ばれる技術の核心で、HTTPSによる安全な通信をはじめ、インターネットの様々な場面で使われている仕組みです。
- 秘密鍵(Private Key):自分だけが持つ鍵。絶対に他人へ渡さない
- 公開鍵(Public Key):誰に知られても問題のない鍵。サービス側や第三者に渡す
この2つの鍵の特徴は、秘密鍵で作った暗号(or 署名)を、対応する公開鍵で復号(or 検証)できる一方、公開鍵から秘密鍵を推測することは現実的に不可能となるように設計されています。公開鍵を誰に見せても問題ないのは、「公開鍵から秘密鍵を逆算できない」という性質があるからです。
公開鍵暗号の主な用途にはデータを隠すための暗号化と、本人性や改ざんの有無を示すための署名(デジタル署名) があります。この記事ではデジタル署名に絞って解説します。
デジタル署名とは?
デジタル署名とは、「誰がそのデータを承認したか」と「途中で書き換えられていないか」を、暗号技術によって証明できる仕組みです。デジタル署名を行うことで、なりすましや送信後のデータの改ざんが困難になります。
先にデジタル署名のポイントをまとめると、次の3点です:
- 秘密鍵で作られた署名が、公開鍵でその正しさを検証できる
- 秘密鍵を持つ本人しか正しい署名を作れないため、なりすましを防げる
- データが少しでも書き換えられると検証に失敗するため、改ざんを見抜ける
この3点を踏まえて読み進めると、仕組みの全体像がつかみやすくなります。
デジタル署名の原理は、
秘密鍵で署名を作り、公開鍵でその署名の本人性を検証するという仕組みです。
『誰でも入手できる公開鍵で確認するなら、中身が丸見えでは?』と思うかもしれません。
デジタル署名の目的は「データを隠すこと」ではなく、「どの秘密鍵の持ち主が承認したか」と「途中で書き換えられていないか」を示すことです。
公開鍵暗号のもう一つの用途である「暗号化」とは目的が異なるため、署名専用のアルゴリズムが使われます。
デジタル署名の中で行われていること
あなたが「Aさんに10万円振り込む」というデータに署名するとします。
署名の作成
あなたはまず、送るデータをハッシュ化(入力データをサイズにかかわらず固定長の要約値を出力する処理)します。そのうえで、その要約値に対して秘密鍵で署名計算を行い、「署名データ」を作ります。
秘密鍵はあなたしか持っていないため、この署名を正しく作れるのはあなただけです。
あなたは元のデータに加えて、さきほど作った署名データも一緒に受信者に送信します。
1. 元データ:"Aさんに10万円振り込む"
2. 元データのハッシュ値:"e9669206fc9cbd58a7bae31df9272b838dfc6306"
3. ハッシュ値と秘密鍵で作った署名データ:"2X3Fl9GF7DeG6rw7ez/r9E/KvdbCIBA1k03MObHU/Wapeuq+GeS1G2IDqwOTKDfai6UBbSARixerI0TRJbXjpvNJ+hsTb4hOmNSD8Zmh5aEp8/53Ri9oX3skSXTOnTsW1PYdVFhfV+s2Z27Yp83jt+SfJKZOqO0Z6HGxsk5mDYzBQciiFhE3E+Ng8NfG+Hk3IHg7kKdA7mFhTY6OhUnwJeypWj3mphXoJTmN26dGnaHaZXNHM+KiqEbkySSONcDB9yTDXn8pAqWxtVGBqd0VcYyQHeN3c9ubybg3g02v7dXte9xfYdYRKVXilSQtbRIjnsHdzfUFiIXTVQChYhPQYg=="
あなたはこのうち、1.元データ、3.署名データを受信者に送信します。
図:署名の作成(送信者)
署名の検証
受信者は、受け取ったデータを同じようにハッシュ化し、そのハッシュ値・署名データ・公開鍵を使って検証計算を行います。
1.受信した元データ:"Aさんに10万円振り込む"
2.受信した署名データ:"2X3Fl9GF7DeG6rw7ez/r9E/KvdbCIBA1k03MObHU/Wapeuq+GeS1G2IDqwOTKDfai6UBbSARixerI0TRJbXjpvNJ+hsTb4hOmNSD8Zmh5aEp8/53Ri9oX3skSXTOnTsW1PYdVFhfV+s2Z27Yp83jt+SfJKZOqO0Z6HGxsk5mDYzBQciiFhE3E+Ng8NfG+Hk3IHg7kKdA7mFhTY6OhUnwJeypWj3mphXoJTmN26dGnaHaZXNHM+KiqEbkySSONcDB9yTDXn8pAqWxtVGBqd0VcYyQHeN3c9ubybg3g02v7dXte9xfYdYRKVXilSQtbRIjnsHdzfUFiIXTVQChYhPQYg=="
3.公開鍵で署名データを復元した結果:"e9669206fc9cbd58a7bae31df9272b838dfc6306"
このとき、署名データを公開鍵で復号した結果と、自分で計算した元データのハッシュ値が一致すれば、
「受信者が持つ公開鍵に対応する秘密鍵を持つ人がこのデータに署名したとみなせる」かつ「データは途中で書き換えられていない」 ことの2点が確かなため、検証に成功したことになります。
図:署名の検証(受信者)
備考
1.「署名の検証」で実際に行われていること
上の説明では「署名データを公開鍵で復号してハッシュ値と比較する」という流れで検証を紹介しました。これはRSAという署名方式においては正確な説明です。
一方、パスキーをはじめ現代の多くのシステムで使われるECDSAという方式では「復号」ステップは存在しません。
ECDSAは「元データのハッシュ値・署名データ・公開鍵」を入力として楕円曲線を用いた計算を行い、「正当か/不正か」という結果のみが返る仕組みになっています。署名データから元データを取り出す操作は行われません。
「秘密鍵を持たない限り有効な署名は作れない」という性質は同じで、最終的に証明できることも変わりません。
2.ハッシュ化を行う理由
署名と検証の両ステップでハッシュ化が使われるのには以下の2つの理由があります。
- 効率性:送信する元データが大きくても、短い要約値に変換してから署名することで計算量を大幅に削減できます
- 改ざん検知:ハッシュ化の性質として、元データが1文字でも変わるとハッシュ値は大きく変わります。そのため、元データにわずかでも改ざんがあれば検証は即座に失敗します。 デジタル署名が「承認」だけでなく 「その後に書き換えられていないこと」まで同時に示せるのは、この性質によるものです
ここで気になるのが、『他人が署名を偽造することは本当にできないのか?』 という点です。
結論から言うと、適切に生成・保管された秘密鍵が用いられる限り、署名の偽造は現実的にはほぼ不可能です。
公開鍵は誰に見られても問題ない鍵です。
攻撃者は、秘密鍵を知らない状態で送信者になりすまし、有効な署名を新しく作ることはできません。
デジタル署名は、公開鍵から秘密鍵を逆算することが数学的に事実上不可能となるように設計されています。
ただし「数学的に絶対不可能」というよりは、今のコンピュータでは実用上、破れることはあり得ないという意味です。
だからこそ実社会では、秘密鍵を安全な領域に保管することや、十分に強い鍵長(暗号鍵の大きさのことで、長いほど解読が難しい)を使うことが非常に重要になります。
身近な活用例で理解する
原理がわかったところで、実際のサービスでどのように使われているかを紹介します。
1. パスキー認証
最近普及している「パスキー」は、パスワードの代わりにデジタル署名を使ってログインする仕組みです。
従来のパスワード認証では、仕組み上ログインを行うサービスのサーバー側に「正解のパスワード」を保存しておく必要があり、サーバーが攻撃されるとパスワードが漏洩するリスクがありました。
パスキーの仕組みは、「登録」と「ログイン」の2つのフェーズに分かれます。
- 登録時:あなたのスマホやPCの中で鍵ペアを作り、「公開鍵」だけをサービスのサーバーに登録します。秘密鍵は端末の安全な領域に保持され、外部に出ることはありません
- ログイン時:サーバーが毎回、新しいランダムな文字列(チャレンジ)を端末に送ります。生体認証や端末ロック解除のあと、端末が秘密鍵でそのチャレンジに署名し、サーバーが公開鍵で署名を検証して、本人によるログインであることを確認します
パスキーは 「初回登録」 と 「ログイン時」 を分けて考えると理解しやすくなります。
初回登録時
ログイン時
上の図から、パスキーのセキュリティ上の利点がわかります。
サーバーには「公開鍵(誰に見られてもOK)」しか保存されていないため、従来のパスワード認証のようにサーバー側に盗まれると困る秘密そのものを保存しません。
また、ユーザーがサービス側に送信するのはサービス側が送信したランダムな文字列に秘密鍵で署名したデータであり、署名データが盗聴されたとしても送信者の端末内にある秘密鍵が知られない限り、悪用することができません。
そのため、サーバー攻撃時に認証情報がそのまま使い回されるリスクを大きく下げられます。
2. ブロックチェーン(暗号資産の送金)
ビットコインなどのブロックチェーン技術でも、デジタル署名が重要な役割を担っています。
ブロックチェーンには中央管理者がいません。代わりに、世界中の参加者(ノード)が「誰が誰にいくら送ったか」という取引データ(トランザクション)をチェックしています。
ブロックチェーンでのデジタル署名の使われ方を流れに沿って見ると次のようになります。
-
あなたが「Bさんへ1BTC送る」という取引を行う時、まず自分の口座(ウォレット)が取引データを作り、それに対してあなたの秘密鍵でデジタル署名を付けます
-
ネットワークの参加者(ノード)は、あなたの公開鍵 を手がかりに、その署名が正しいかを検証します。署名が正しければ、「対応する秘密鍵を持つ人がこの送金を承認した」と判断され、取引の正当性確認の一部として扱われます
ただし、実際にブロックチェーンへ受け入れられるかどうかは署名だけでは決まりません。二重送金でないか、使おうとしている残高やコインが本当に存在するか、ネットワーク全体のルールに合っているか、といった他の検証もあわせて行われます。
誰もあなたの秘密鍵を知らないため、他人が勝手に「あなたからCさんへ100BTC送る」という偽の取引を作っても、偽の取引の署名を偽造できず、 ネットワークから拒否されます。
(補足) ブロックのハッシュ連鎖:過去の記録を守る仕組み
デジタル署名が「誰が取引を承認したか」を保証する一方で、ブロックチェーンの 「過去の取引記録が書き換えられていないか」 を担保しているのは、ハッシュ連鎖という別の仕組みです。
複数の取引をまとめた「ブロック」には、直前のブロックのハッシュ値が必ず含まれています。
あるブロックのデータを1文字でも改ざんすると、そのブロックのハッシュ値が変わります。すると次のブロックが持っている「前のブロックのハッシュ値」と不一致になり、それを隠すには以降のすべてのブロックを改ざんし、作り直さなければなりません。
ビットコインの場合、各ブロックの改ざんに膨大な計算が必要であるうえに、世界中の参加者が常に新しいブロックを追加し続けているため、一人で過去に遡って作り直し追いつくことは現実的に不可能です。
図:ブロックのハッシュ連鎖
ブロック1を書き換えるとHash①が変わります。すると「前Hash: Hash①」を持つブロック2が不正となり、ブロック3、4…と連鎖的にすべて作り直す必要が生じます。
つまり過去のブロックほど改ざんコストが膨大になります 。
ブロックチェーンは、デジタル署名によって誰が取引を承認したかが保証され、ハッシュ連鎖によって過去の記録が書き換えられていないかが担保されます。
まとめ
難しそうに聞こえる「デジタル署名」ですが、その技術がどのように使われているか知ると重要性がよくわかります。
- パスキー:サーバーに公開鍵だけを渡し、秘密鍵はユーザー端末の外に出さない。公開鍵から秘密鍵を逆算できないことで、サーバーが侵害されても、秘密そのものは漏れない
- ブロックチェーン:秘密鍵を持たない者は有効な署名を作れないため、他人名義の取引は即座に拒否される。さらにブロックのハッシュ連鎖により、過去の記録の改ざんは膨大なコストが発生して現実的に不可能
どちらの仕組みも
- 「秘密鍵を持つ本人しか署名できない」
- 「データが変われば署名も崩れる」
というデジタル署名の2つの性質の上に成り立っています。
デジタル署名について理解することで、パスキー認証が従来のパスワード認証よりも安全性が高い理由を理解できます。また、ブロックチェーンの台帳のセキュリティをより実感することができます。
参考文献
-
電子署名の仕組み|JIPDEC(日本情報経済社会推進協会) — 公開鍵暗号・ハッシュ関数・署名生成と検証の流れを図解付きで解説しています
-
電子署名と公開鍵暗号方式|JIPDEC(日本情報経済社会推進協会) — 公開鍵暗号の署名方式の違いについて解説しています。の署名方式の違いについて解説しています