「改竄」とは
改竄(かいざん)とは、データや文書などの内容を、正当な権限なく書き換えることです。
例えば、Webページの文章を第三者が勝手に書き換えたり、学校の成績データを権限のない人が変更したり、配布されたソフトウェアの一部を悪意のあるプログラムに置き換えたりすることが改竄に当たります。
情報セキュリティでは、改竄を防いだり検出したりすることが重要です。
改竄と「完全性」
情報セキュリティには、特に重要な三つの性質があります。
- 機密性:許可された人だけが情報を見られること
- 完全性:情報が正確であり、不正に変更されたり失われたりしていないこと
- 可用性:必要なときに情報やシステムを利用できること
改竄は、このうち特に完全性を損なう行為です。
例えば、
- 通信内容を第三者に盗み見られる → 機密性が損なわれる
- Webページを勝手に書き換えられる → 完全性が損なわれる
- 大量の通信によってWebサービスが使えなくなる → 可用性が損なわれる
となります。
ハッシュ値による改竄の検出
データが途中で変更されていないかを確認する方法の一つに、ハッシュ値を利用する方法があります。
ハッシュ値とは、データをハッシュ関数に入力して得られる、一定の長さの値です。
暗号学的ハッシュ関数には、主に次のような性質があります。
- 同じデータからは同じハッシュ値が得られる
- データを少し変更すると、通常は大きく異なるハッシュ値になる
- ハッシュ値から元のデータを実用的な時間で復元することは困難である
- 異なるデータから同じハッシュ値を作ることが困難になるよう設計されている
例えば、送信者がファイルのハッシュ値を計算しておき、受信者も受け取ったファイルからハッシュ値を計算します。
送信前のハッシュ値と受信後のハッシュ値が一致すれば、
「途中でデータが変更された可能性は低い」
と判断できます。
反対に、ハッシュ値が異なれば、ファイルが途中で変更された、破損したなど、何らかの変化があったことが分かります。
ただし、ハッシュ値を比較するだけの場合には注意が必要です。
攻撃者がファイルだけでなく、比較に使うハッシュ値まで書き換えることができれば、改竄を見抜けない可能性があります。そのため、重要なデータでは、ハッシュ値だけでなくデジタル署名などを利用します。
また、ハッシュ値は一定の長さしかないため、異なるデータから同じハッシュ値が得られる衝突は理論上存在します。そのため、実際には衝突を見つけることが十分困難な安全性の高いハッシュ関数を使用します。
デジタル署名による改竄の検出
改竄の検出に重要な技術がデジタル署名です。
デジタル署名では、一般に次のような処理を行います。
1.送信者がハッシュ値を求める
送信する文書やファイルから、ハッシュ関数を使ってハッシュ値を求めます。
文書
↓
ハッシュ関数
↓
ハッシュ値
2.秘密鍵を使って署名を作る
送信者は、自分の秘密鍵を使ってハッシュ値に対するデジタル署名を作成します。
そして、
を受信者へ送ります。
3.受信者が署名を検証する
受信者は、送信者の公開鍵を使ってデジタル署名を検証します。
同時に、受信した文書から自分でもハッシュ値を計算します。
これらを照合することによって、
- 署名後に文書が変更されていないか
- その公開鍵に対応する秘密鍵によって署名されたか
を確認できます。
したがって、デジタル署名はデータの完全性の確認に利用できます。
デジタル署名で確認できること
デジタル署名によって主に確認できるのは、
- データが署名後に改竄されていないこと
- 対応する秘密鍵によって署名されたこと
です。
例えば、ソフトウェアの配布元がプログラムにデジタル署名を付けておけば、利用者はダウンロードしたプログラムが配布後に改竄されていないか確認できます。
電子メールや電子文書についても同様です。
ただし、
「その公開鍵が本当に送信者本人の公開鍵なのか」
という問題があります。
そこで、公開鍵とその所有者との対応を確認するために電子証明書などが利用されます。
信頼できる電子証明書によって、
「この公開鍵はXさんのものである」
と確認できている場合、デジタル署名の検証に成功すれば、
「Xさんに対応する秘密鍵で署名され、その後データが改竄されていない」
と確認できます。
デジタル署名と暗号化は目的が異なる
デジタル署名と暗号化は混同しやすいですが、目的が異なります。
デジタル署名
→ 「誰が署名したか」「途中で改竄されていないか」を確認する
暗号化
→ 内容を第三者に読まれないようにする
したがって、デジタル署名を付けても、文書そのものが暗号化されていなければ、第三者が内容を読める場合があります。
逆に、暗号化されていても、それだけで送信者の確認や改竄の検出ができるとは限りません。
つまり、
- 改竄されていないか → 完全性
- 誰が作成・送信したか → 真正性
- 他人に読まれないか → 機密性
を区別します。
デジタル署名では確認できないこと
デジタル署名は強力な技術ですが、何でも確認できるわけではありません。
例えば、デジタル署名を検証しても、
- 文書の内容が客観的な事実であること
- 文書にマルウェアが含まれていないこと
- 文書の内容が第三者に読まれていないこと
- サーバが停止しないこと
- 改竄された場合に、どの文字が変更されたのか
- 秘密鍵が過去にも将来にも絶対に漏えいしないこと
などは保証されません。
署名が保証するのは、あくまで署名の対象となったデータと署名との関係です。
例えば、
「明日は必ず晴れる」
という文書に正しいデジタル署名が付いていても、「明日晴れる」という内容そのものが正しいことを保証するものではありません。
改竄を「防ぐ」アクセス制御
ハッシュ値やデジタル署名は、主に改竄を検出・確認するために利用されます。
これに対し、そもそも権限のない人がデータを書き換えられないようにする仕組みがアクセス制御です。
例えば、成績データについて、
- 教員は閲覧・変更できる
- 生徒は閲覧だけできる
- 関係のない利用者はアクセスできない
というように権限を設定します。
ユーザIDやパスワードなどで利用者を認証し、その人に認められた操作だけを許可することで、不正な改竄を防ぎやすくなります。
したがって、
アクセス制御 → 改竄を防ぐ
ハッシュ値・デジタル署名 → 改竄を検出する
と整理できます。
変更履歴による改竄の発見
データが変更されたときに、その履歴を記録しておくことも重要です。
例えば、成績データを変更するときに、
- 誰が変更したか
- いつ変更したか
- 変更前の値
- 変更後の値
を記録しておきます。
すると、
「数学の成績が80点から95点に変更されている」
ということだけでなく、
「誰が、いつ、80点から95点へ変更したのか」
まで確認できます。
このような記録をログなどとして保存しておけば、不正な変更の発見や原因の調査に役立ちます。
ただし、攻撃者が履歴そのものを書き換えられてしまっては意味がありません。そのため、
- ログへの書込み権限を制限する
- 通常のデータとは別の場所に保存する
- 定期的にログを確認する
などの対策も必要です。
ブロックチェーンと改竄
ブロックチェーンも、記録の改竄を困難にしたり、改竄を検出しやすくしたりする仕組みとして利用されます。
ブロックチェーンでは、取引などの記録をまとめた「ブロック」を順番につなげて保存します。
一般に、それぞれのブロックには前のブロックの情報から計算されたハッシュ値などが含まれます。
そのため、過去の記録を変更すると、その後のブロックとのつながりに矛盾が生じます。
さらに、複数の参加者が同じ履歴を共有し、一定の合意の仕組みによって記録を管理することで、一人の利用者が自分の持っている記録だけを書き換えても、他の参加者が持つ記録との違いを発見しやすくなります。
ただし、ブロックチェーンが保証するのは主に、
「一度記録した情報を後から勝手に変更しにくいこと」
です。