「ハッシュ」と聞くと多くの人が「ハッシュドビーフ!」って思うかもしれませんが、今回はコンピュータの世界における「ハッシュ」に関してのお話です。
ハッシュという仕組みを使うことで、データの信頼性を高めることができます。
具体的には通信や認証、データ検索などで使われていますので、それらの利用場面なども解説します!
ハッシュとは?
ハッシュ(HASH)は「細かく刻む」という意味があります。
(余談ですが、ハッシュドビーフは「細かく刻んだ野菜と薄切りの牛肉を炒めて煮込んだ料理」というのが由来のようですね)
コンピュータの世界においては「ハッシュ化する」とみたいな言葉の使い方をしますが、意味としては、
データを非可逆の別の形に変換する
となります。
「ん?非可逆?」と思う方もいると思いますので、先ずは非可逆の反対の「可逆」の変換に関して説明します。
可逆変換とは?
「可逆変換」とは、変換したものを元に戻すことができることを意味します。
これは暗号化やデータを圧縮する時に使われますが、あるルールに基づいて変換するので、そのルールを知っていれば元の形に戻すことができます。
勿論、暗号化などでデータを秘密にする際は、そのルールは特定の人にしか教えてはいけませんね。
下図の例の場合は、変換前の「ひらがなの文字を右に一つずらす」というルールに基づいて暗号化しているので、ひらがなの文字を左に一つずらせば元の形に戻せますね。
それで、ハッシュは先ほども記載したとおり、可逆ではなく「非可逆」な変換となりますので、続いてその説明をします!
ハッシュ化の仕組み
くどいですが、ハッシュは「非可逆変換」と呼び、可逆とは反対なので、データを変換したら元には戻せません。
「えー、戻せないのー?不便だなー」って思うかもしれませんが、この特徴を上手く使うことで、色々な場面で使われています。
ハッシュ関数と呼ばれる関数にデータ(文字)を入力することで、「ハッシュ値」と呼ばれる決められた長さのデータ(文字列)が出力されます。
ハッシュ値のことを「ダイジェスト」と呼ぶこともありますね。
そして、ハッシュ値の大きな特徴として、以下のポイントがあります。
ハッシュ関数に入力されるデータが同じであれば、必ず同じハッシュ値が得られる
ということなので、入力されるデータが異なれば、ハッシュ値も全然違うものになります。(と言いつつも、実は「衝突」といって、ハッシュ値が同じになってしまうこともあるので、その辺を考慮した関数が作られています)
ハッシュ関数の種類
ハッシュ関数にはいくつか種類があって、新しく考案された関数の方が、元のデータを推測されににくなっています。
代表的なハッシュ関数
- MD5:128ビットのハッシュ値を生成する。衝突が発見されているので、セキュリティには不向き
- SHA-1:160ビットのハッシュ値を生成する関数。MD5より強度が高いが、衝突が発見されているので、セキュリティには不向き
- SHA-2:SHA-1の改良版で、224, 256, 384, 512ビットのハッシュ値を生成する関数。SHA-1より強度が高く、現在は広く利用されている
- SHA-3:SHA-2までの方式とは異なるもので、最新のハッシュ関数
SHAは「シャー」と呼びますね。
ハッシュの使い道
では、ハッシュのメリットを使って、どんな仕組みに使われているか解説します。
データの改ざん防止
インターネット経由でメールや投稿でメッセージを送る際に途中の経路で悪意ある人にデータを改ざんされてしまう恐れがあります。
この改ざんを防ぐためにハッシュを使っています。
- 送信側が送るメッセージ(平文とも呼びます)のハッシュ値を作成する(ハッシュ化)
- メッセージと一緒にハッシュ値も送る
- 受信側は受け取ったメッセージ(平文)に対してハッシュ関数でハッシュ値を作成する
- 送信側のハッシュ値と受信側で作成したハッシュ値を比較する
- 同じ値なら、改ざんされていない。違う値なら改ざんされていることが分かる
送信側も受信側も同じハッシュ関数を使わないと値が変わってしまうので、注意しましょう。
パスワード認証
Webサイトやアプリを使う時にパスワード認証はよく使われています。
このパスワードの認証において、個人のパスワードはデータベースに格納されることになりますが、データベースのデータがもしも盗まれてしまったらどうなるでしょうか?
IDとパスワードがセットで盗まれてしまうので、他のサイトにアクセスしたりして、様々な悪いことをされてしまいます。
このような最悪の事態を防ぐために、データベースへのパスワードをハッシュ値として格納しておく方法を取ります。
- サイトへのIDを作成した際にパスワード設定するが、そのパスワードはハッシュ化し、ハッシュ値としてデータベースに格納しておく
- 利用者がサイトへログインする際はアプリケーションサーバ上で受信したパスワードをハッシュ関数に通して、ハッシュ値を作成する
- 作成したハッシュ値をデータベースに格納されているパスワードのハッシュ値と比較する
- パスワードのハッシュ値が一致したら本人として認証OKとする
この認証方式を使うことで万が一、データベースの情報が盗まれてもパスワードはハッシュ化されているので、そこから元のパスワードを取り出すことはできません。
これにより、情報漏洩時の被害を抑えることができますね。
その他にも、ハッシュは特定のデータを見つけ出す「探索アルゴリズム」としても使われています。ハッシュを使った、探索アルゴリズムは検索したいデータを一発で探し当てることができるので、検索の速度が速くなることが特徴ですね。
まとめ
今回はハッシュの仕組みと使い方やメリットに関して解説しました。
ハッシュのまとめ
- ハッシュはデータを非可逆の別の形に変換するためのもの
- 同じデータを入れたら、ハッシュ値としては必ず同じデータが出力される
- ハッシュ値からは元のデータを取り出すことはできない
- ハッシュ関数はいくつか種類がある
- ハッシュはデータの改ざん防止やパスワード認証、検索性能向上のために使われる
ハッシュはいろんなところで出てきて、最初はなかなか理解しにくいのですが、分かると非常に便利な仕組みなので、ぜひ覚えてみてください。
ハッシュとは逆の可逆変換でデータを圧縮する方式として「ランレングス符号化」というものがあって、その解説記事も書いてますのであわせて読んでみてください。
以上です!
-
あわせて読むランレングス符号化の使い方とメリットを解説!
続きを見る