データの安全性がますます重要視される現代において、ハッシュ化はデータセキュリティの基礎として欠かせません。
ハッシュ化は、パスワードの保護から改ざんの検出まで幅広い応用があります。本記事では、ハッシュ化の基本原理からその重要性、さらには実際の利用例について詳しく解説します。データの保護とセキュリティ強化のために、ハッシュ化が果たす役割について理解を深めていきましょう。
キーワード:セキュリティ、ハッシュ化
1. ハッシュ化の基本
ハッシュ化はセキュリティを学んでいく上で欠かすことのできない用語です。
まず、ハッシュ化について解説します。
1-1. ハッシュ化とは?
ハッシュ化とは、ハッシュ関数を用いて元データを別の固定長の文字列へと変えることです。また、この固定長の文字列をハッシュ値と言います。
例えば、「password」というデータをハッシュ化し、「OdeNkonBu」という文字列になったとします。この時、元データが「password」で、ハッシュ値が「OdeNkonBu」です。
ハッシュ関数とは、定められた計算手順だと思っておくとよいです。ハッシュ関数によってハッシュ値の文字数は異なり、64文字、72文字など複数あります。
実は、ハッシュ値から元データを求めることが困難という特徴があります。そのため、パスワードやメッセージなど中身を知られたくないものに対してハッシュ化をすることが多いです。(詳細は後述)
・ハッシュ化とは、ハッシュ関数を用いて元データを別の固定長の文字列へと変えること
・ハッシュ化された値を元に戻すのは困難
1-2. ハッシュ関数の性質
ハッシュ関数には以下の性質があります。
- 同じハッシュ関数でハッシュ化すると、必ず文字数が同じになる
- 元データが同じであれば、必ず同じハッシュ値になる
- ハッシュ値から元データを特定することが不可能
- 同じハッシュ値となる、異なる2つの元データを見つけるのが不可能
それぞれの性質について確認していきます。
[1] 同じハッシュ関数でハッシュ化すると、必ずハッシュ値の文字数が同じになる
これはハッシュ化の定義から明らかです。ハッシュ化は固定長の文字列へと変換します。
[2] 元データが同じであれば、必ず同じハッシュ値になる
同じデータをハッシュ化しても、ハッシュ値は変化しません。
「password」というデータをハッシュ化して、「OdeNkonBu」になったとします。たとえその2日後に再び「password」をハッシュ化しても、「OdeNkonBu」になります。
しかし、異なるデータでは必ず異なるハッシュ値になります。
「password」と「PASSWORD」という文字列は、小文字か大文字かという違いがあります。そのため、これらをハッシュ化すると異なるハッシュ値が得られます。
[3] ハッシュ値から元データを特定することが不可能
ハッシュ関数には一方向性があります。元データからハッシュ値を求めることは簡単です。しかし、逆はうまくいきません。ハッシュ値が得られたとしても、それに対応する元データを特定することはできません。
[4] 同じハッシュ値となる、異なる2つの元データを見つけるのが不可能
基本的に元データとハッシュ値は1対1になります。
けれども、ハッシュ値は固定長です。理論上では同じハッシュ値となる、異なる2つの元データは存在してしまいます。これを「衝突」といいます。
これらの性質のおかげでハッシュ化は重要な存在となっています。次は、ハッシュ化の役割について見ていきましょう。
1-3. ハッシュ化の役割
ハッシュ化はパスワードを保存するときなどに使われます。データベースにユーザーが設定したパスワードをそのまま保存してしまうと、悪意のある第三者に情報を抜き取られた場合、アカウントへのログインが容易にできてしまいます。
しかし、パスワードのハッシュ値を代わりに保存しておけば、万が一情報を抜き取られたとしても、不正アクセスを防ぐことができます。
ハッシュ化は固定長の適当な文字列に変えることであり、ハッシュ値から元データを特定することは困難という性質がありました。そのため、パスワードのハッシュ値だけが分かっても、パスワード自体を知ることはできません。
また、ハッシュ化はデータの改ざんを検出することもできます。
先ほど、元データが同じならばハッシュ値も同じになるということを確認しました。もし過去のデータと現在のデータが同じであれば、それぞれのハッシュ値も同じになるはずです。
現在に至るまでの間に、悪意のある誰かが書き換えた場合、この2つのハッシュ値は異なります。そのことから、現在のデータは改ざんされたと証明できます。
2. ハッシュ化の応用例
ここまでは、ハッシュ化の基本的な事柄を説明してきました。
次は、このハッシュ化がどのように生かされているのかを見ていきましょう。
電子署名
電子署名とは、電子文書を誰が書き、改ざんされていないことを証明するためのものです。
元データのハッシュ値と送信後のデータのハッシュ値を比較して、改ざんされていないことを証明します。
これは「②元データが同じであれば、必ず同じハッシュ値になる」という性質が用いられています。
ブロックチェーン
ブロックチェーンとは、ブロックと呼ばれるデータを繋げ合せる自立分散システムのことである。
ビットコインなどの仮想通貨はこのブロックチェーン技術を利用している。
ブロックチェーンがなぜ仮想通貨に用いられているかというと、改ざんが不可能かつシステムダウンが起きないからだ。
仮想通貨の取引情報をブロックとし、それぞれのハッシュ値を求めます。ハッシュ値は元データが少し変わるだけで、全く違う値になる性質がありました。そのため、あるブロックのハッシュ値はただ一つだけの固有の値になります。このハッシュ値が、データベースにおける主キー(複数のデータから特定するために必要なデータ)のように働きます。
もし、データが改ざんされたら、ブロックのハッシュ値が異なってしまい、繋がっている他のブロックとの整合性が取れません。
3. ハッシュ化と暗号化の違い
ここまで読んで、ハッシュ化について理解が深まっていったと思います。
ハッシュ化と似たような仕組みで、暗号化があったと思います。暗号化もデータを別の文字列へと変え、元データが何かわからなくする技術でした。
この章では、ハッシュ化と暗号化の違いを見ていきます。
ハッシュ化とは、ハッシュ関数を用いて元データを別の固定長の文字列へと変えることでした。
暗号化とは、元データを異なる文字列へと変換し、解読不可能にすることです。
ただし、暗号化されたデータは元のデータに直す(復号)ことができます。
ハッシュ化と暗号化の違いは、復号可能かどうかという点です。
ChromeでWebサイトを開くと、上部にURLが表示されます。このサイトもそうですが、URLの先頭に「https」と表示されているはずです(すべてのサイトがhttpsとは限りません)。「https」と表示されている場合は、通信が暗号化されています。
そのため、復号することで元データを知ることができます。暗号化することで、第三者に元データを知られることなく通信が可能になりました。
4. ソルトについて
パスワードをハッシュ化することで、元データがどんなものだったのかを特定することが不可能と学習しました。
しかし、元データに対応するハッシュ値を事前に知られていたらどうでしょうか?
例えば、あらかじめ複数の元データに対応するハッシュ値を調べておいたとします。何らかの方法で、ハッシュ値を手に入れた時、先ほど調べた中に同じハッシュ値が存在すれば、元データを特定することができます。なぜなら、元データとハッシュ値はほぼ1対1だったからです。
ハッシュ値を調べ、まとめた表は「レインボーテーブル」と呼ばれています。そして、レインボーテーブルを使った攻撃が「レインボー攻撃」です。
レインボー攻撃を防ぐために、元データに「ソルト」という任意の文字列を追加することがあります。
パスワードが「password」だと、よくありがちなため、レインボーテーブルに含まれている可能が高いです。そこで、ソルトとして「User10」という文字列を選び、パスワードに加えます。ソルトを加えた「User10password」をハッシュ化することで、「password」と異なるハッシュ値が得られました。
その結果レインボー攻撃によるパスワードの特定を防ぐことができます。
5. まとめ
ハッシュ化の意味とその利用例、さらに暗号化との違いについて解説しました。
ハッシュ化はパスワードを保存する上で大切な操作です。しかし、一見安全そうに見えるハッシュ値でも、ソルトやペッパーを使用していないとレインボー攻撃の被害に遭ってしまうかも知れません。
ハッシュ化に頼るのもよいですが、パスワード自体を強力なものにしておくことも重要です。
最後までご覧くださり、ありがとうございます!お疲れ様でした。
コメント