暗号の基本(その2)
多くのITエンジニアは開発でハッシュ値を利用したことがあると思います。そんな中、お作法的な理解の元にGitのコミットハッシュを取得して利用した経験はありませんか?
今回もそんな、身近で利用される暗号の基本的な内容を簡単にまとめてみました。
暗号の必要性
暗号は情報セキュリティにおける重要な要素である機密性と完全性を守るために存在します。(前回の投稿参照)
その中でも完全性を担保するための技術として以下の二つがあり、ハッシュ関数を利用して暗号化が行われています。
メッセージ認証コード(MAC)
デジタル署名
ハッシュ関数
メッセージから主に固定長の要約値(ハッシュ値)を算出する関数となります。ハッシュ値は改ざんの検知やデータ比較(検索)時のキーに利用されたりします。
また、暗号学的に以下の3つの条件を満たした関数の事を指します。
衝突発見困難性
同じハッシュ値を算出する別のメッセージを算出することが困難である事。
第2原像計算困難性
メッセージとハッシュ値の組み合わせが与えられた際に、同じハッシュ値を算出する別のメッセージを算出することが困難である事。
原像計算困難性
ハッシュ値が与えられた際に、元のメッセージを算出することが困難である事。
メッセージ認証コード
メッセージのハッシュ値を比較することで改ざんを検知する方式で、一般的にはMAC(Message Authentication Code)と表現します。
ハッシュ関数のアルゴリズムは公開されているため、通信の途中でメッセージとハッシュ化したした情報を合わせて改ざんできてしまう課題があります。
HMAC
事前に秘密鍵(共通鍵)を共有してハッシュ関数に利用する方式です。
HMACはHash-based MAC または keyed-Hash MACと略されますが、後者の略の方がより厳密に本技術を表現していると(個人的には)思っています。
同じメッセージに同じハッシュ関数を利用しても、事前に共有している秘密鍵情報に従って違うハッシュ値が算出されるようになり、送信者からのメッセージが改ざんされているかどうか検知出来るようになります。
ちなみに、ハッシュ関数を利用しないでブロック暗号を利用する方式もあり、そちらをCMAC(Cipher-based MAC)と呼びます。
デジタル署名
認証局に検証鍵(公開鍵)を提出することで、改ざんの検知と送信者の証明を同時に実施する方式です。
上記では署名と略していますが、実際にはハッシュ関数によるハッシュ値の生成と署名鍵による暗号化が含まれています。(全部書くと複雑なので割愛しました)
また、上記フローで生成される証明書がサイトのHTTPSなどで利用される、所謂、デジタル証明書となります。
最後に
今回はハッシュ関数(不可逆な暗号)を利用した改ざん検知の基本的な内容となります。デジタル署名の話が出てきたため、身近なWeb通信で利用されるデジタル証明書との関係性も気になるところですね。
ちなみに、実際にGitのハッシュコミット値の求め方はこちらの投稿を参考にすると算出可能なようです。
このような暗号技術の基本から、セキュリティに対しての理解を深めるキッカケにしてもらえれば幸いです。
余談
本記事の画像は2023年11月11日に開催されたJJUG CCC(日本Javaユーザグループ クロスコミュニティカンファレンス)で登壇した際のスライドを一部抜粋(+加筆修正)したものになります。
この記事が気に入ったらサポートをしてみませんか?