ハッシュ関数は「データの指紋」を作る技術です。改ざん検知やパスワード保管に欠かせません。ハッシュの性質、SHAシリーズ、そしてメッセージ認証コード(HMAC)まで正確に押さえましょう。
ハッシュ関数って、データを短い値に変換するやつだよね? 暗号とは違うの?
いいところに気づいたわね。
ハッシュ関数は、任意の長さのデータから固定長の値(ハッシュ値、メッセージダイジェスト)を計算する関数よ。
暗号と違って元に戻せない、つまり復号できないのが大きな違いなの。
同じデータからは必ず同じハッシュ値が得られるのですよね。
ええ。
そして少しでもデータが変わると、まったく違うハッシュ値になるの。
だから改ざん検知に使えるのよ。
受信データのハッシュ値を計算して、送られてきたハッシュ値と比べれば、途中で書き換えられていないか確認できるわ。
データの指紋みたいなものなんですねぇ。
まさにそう。
重要な性質が2つあるわ。
1つは、ハッシュ値から元データを求められない一方向性。
もう1つは、同じハッシュ値になる異なるデータを見つけにくい衝突困難性よ。
その性質があるから、パスワードの保管にも使うんだっけ?
はい。
パスワードそのものではなく、そのハッシュ値を保存しておけば、漏えいしても元のパスワードが分かりにくいのですよね。
その通り。
ただし同じパスワードは同じハッシュになるから、ソルトという乱数を付け加えてからハッシュ化するのが定石よ。
代表的なアルゴリズムがSHA-256などのSHA-2シリーズね。
古いMD5やSHA-1は衝突が見つかっていて危殆化しているから使ってはいけないわ。
ところで、メッセージ認証コードって何? ハッシュと似てる気がする。
メッセージ認証コード(MAC)は、ハッシュに共通鍵を組み合わせたものよ。
ただのハッシュ値だと、攻撃者がデータもハッシュ値も両方書き換えられてしまうけれど、鍵を知らないとMACを計算できないから、完全性とメッセージ認証(なりすまし防止)を同時に守れるの。
その代表がHMACですね。
ええ。
HMACはハッシュ関数(SHA-256など)と共通鍵を使ってMACを生成する方式で、HMAC-SHA256のように書くわ。
デジタル署名と違って共通鍵を使うから、送受信者が同じ鍵を共有する必要がある点は押さえておいてね。
ハッシュは鍵なし、MACは鍵あり…だからMACは相手が本物かも確かめられるんですねぇ。
確認クイズ
ハッシュ関数の性質に関する記述のうち、適切なものはどれか。
- ハッシュ値から元のメッセージを復元することが容易である
- 入力データが1ビットでも変わると、まったく異なるハッシュ値が得られる
- 異なる入力から同じハッシュ値を意図的に生成することが容易である
- 入力データの長さに応じてハッシュ値の長さも変化する
こたえを見る
正解: 2. 入力データが1ビットでも変わると、まったく異なるハッシュ値が得られる
正解は「1ビット変われば全く異なるハッシュ値になる」。この性質(なだれ効果)により改ざん検知に使える。選択肢1は一方向性に反するため誤り(ハッシュ値から元データは復元できない)。選択肢3は衝突困難性に反するため誤り(同じハッシュ値になる別データを見つけるのは困難でなければならない)。ハッシュ値は入力長によらず固定長なので選択肢4も誤り。