IT用語/ハッシュ関数

ハッシュ関数(2014-09-13、追記:2017-03-14)



ハッシュ関数とは

ハッシュ関数は、対象のデータを固定長のデータ(ハッシュ値*1)に圧縮する機能です。
データの改竄を検知したり、DB検索のインデックスに使ったりします。はたまた個人情報(パスワード)を保存するときに情報そのものではなくハッシュ値を保存することで、セキュリティを若干上げることができます。

例えば、LinuxのMD5コマンド(後述)を使ってハッシュ値を得るには、

■ IROHA.txtの中身=「いろはにほへとちりぬるを(中略)ゑひもせす」
$ md5sum IROHA.txt
3bdf7dbee70f27b34998935811624a22  IROHA.txt
■ IROHA.txtの中身=「いろはにほへとちりぬるを(中略)ゑひもせす!」
■ 最後に「!」が増えました。
$ md5sum IROHA.txt
9c027e1a2a67967d26c6f4434f4086b5  IROHA.txt

この「3bdf7d~」とか「9c027e~」とかが「ハッシュ値」です。

ハッシュ値の特徴としては

  • 入力されたデータごとに、異なるハッシュ値となる。
    かつ、同じ入力データならば、同じハッシュ値になる。
  • 異なるデータから同一のハッシュ値が生成される(衝突する)可能性は極めて低い。(耐衝突性)
    ただし、0%にはなら無い。
  • ハッシュ値から元のデータを逆算はできない(不可逆関数。一方向性)
  • 一般的には、データの長さに関わらず生成されるハッシュ値は常に同じ長さになる

2017-02 に sha1ハッシュの衝突(コリジョン)に成功というニュースがありました。
たまたまではなく故意に同一ハッシュ値の別ファイルが作れるという事で、
極端な話、アプリが(sha1検査上)本物のファイルですというので開いたら
実は偽ファイルでウィルス感染しました、みたいなことができるようになったという話です。

MD5

128bitのハッシュ値を出力する。結論から言うと既に安全ではない。ハッシュ値の衝突を利用したファイルの改竄を行う方法が見つかっている。

SHA-1

160bitのハッシュ値を出力する。これも攻撃法が発見済みで安全ではない。

SHA-2

224、256、384、512bitのハッシュ値を出力する。SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256をまとめてSHA-2。
SSLやTLS、IPSec、SSH、S/MIMEなどで使われており、SHA-256はDKIMやDNSSECで使われ、CRYPTRECでも採用されている方式。

RIPEMD

オープンコミュニティで開発された規格(SHAはアメリカ国家安全保障局 NSA)。ちょっと調べたけど安全性は良く分からなかったので(SHA1程度?)、参考程度に。

HMAC(Hash-based MAC)

メッセージの改竄を検出する技術としてMAC(Message Authentication Code:メッセージ認証符号)があり、その実装方法の1つとしてHMACがあります。
前述のMD5やSHA1などのハッシュ関数を組み合わせることで、HMAC-MD5、HMAC-SHA1、HMAC-SHA256と呼ばれます。
構成要素はこんな感じ

ハッシュ値 = ハッシュ関数(SHA-2など) & 共通鍵 & 対象データ (&諸々の関数)

SSLやTLS、IPSecではHMACが使われています。


*1 ほぼ同じ意味としてメッセージダイジェスト、フィンガープリント(指紋)

  最終更新のRSS