セキュリティ セキュリティ

ハッシュ化

2019年4月29日

ハッシュ化とは


ハッシュ化とは、元のデータから一定の計算手順に従ってハッシュ値と呼ばれる規則性のない固定長の値を求め、その値によって元のデータを置き換えること。パスワードの保管などでよく用いられる手法である。


IT用語辞典より

本来はファイルの改ざん、破損チェックに使用するのですが、パスワード管理用としても使われるようになっています。
最近ではパスワード管理としてハッシュ化したデータを保管するのがアプリケーションとして必須要件になってきてますね。

ハッシュ化の特性

どんな特性なのかを簡単に説明すると

  • どんな大きなデータでも出力結果は一定(固定長)
  • 指定されたルール(アルゴリズム)に従って結果を出力するため、同じデータの場合は必ず同じ結果になる。(1bitでもデータが異なると結果が変わる)
  • 一方向性(不可逆)関数であること。(入力データから出力データに変換はできるが、出力データから入力データに変換することはできない)
  • 弱衝突耐性(ハッシュ値から入力元データを探すのが困難)
  • 強衝突耐性(ハッシュ値が同じ2つ以上の入力元データを探すのが困難)

ハッシュアルゴリズムの種類

ハッシュアルゴリズムは大きく「MD」、「SHA-0」「SHA-1」、「SHA-2」、「SHA-3」に分かれます。

アルゴリズムダイジェスト長ラウンド数 セキュリティ強度
MD2128bit18  
MD4
128bit3  
MD5128bit4 
MD6 d(可変長) 可変  
SHA-0160bit80 80bit
SHA-1 160bit 80 63bit
SHA-2 SHA-224 224bit 64 112bit
SHA-256 256bit 128bit
SHA-384 384bit 80 192bit
SHA-512 512bit 256bit
SHA-512/224 224bit 112bit
SHA-512/256 256bit 128bit
SHA-3 SHA3-224 224bit 24 112bit
SHA3-256 256bit 128bit
SHA3-384 384bit 192bit
SHA3-512 512bit 256bit
SHAKE128 d(可変長) d/2と128のいずれか小さい方
SHAKE256 d(可変長) d/2と256のいずれか小さい方

セキュリティ強度はbit数が高いほど攻撃耐性(突破されにくい)を持ちます。
最近よく使われているのはSHA-256(SHA-2)です。
SHA-2及びSHA-3よりダイジェスト長(出力される文字列の長さ)に種類があり、ダイジェスト長は長いほうがセキュリティ強度は上がりますが、負荷が高くなります。

MD6は幻。
SHA-0も欠点が見つかったため、すぐにSHA-1へ移行されました。

MD5は同じハッシュ値で別の文字列探索が通常のPCでも簡単にできる(強衝突耐性低い)ため、パスワード管理などのセキュリティ分野では使用禁止となっているアルゴリズムになりました。
現在はファイルチェック用としてがメインになってます。

誕生日攻撃に対するSHA-1の 耐性は80bitですが、研究が進んでいるおかげか63bit(57bit説あり?)までセキュリティ強度が落ちているようです。

SHA-3はSHA-2とは別のアルゴリズムになっていますが、SHA-2は今のところ問題が発見されていないため、あまり移行が進んでいないのが現状。

ファイルの改ざん・破損チェックとして利用

ハッシュ値を用いた利用方法はファイルの改ざん・破損チェックとして利用されえています。

たとえば、OSSソフトウェアのダウンロードサイトで有名なOSDNではファイル情報としてハッシュ値を表示しています。

ほかにもPHPダウンロードサイトでもSHA256のハッシュ値が公開されています。

そのほかにgitにもハッシュ値が使用されていますね。

パスワード管理にも利用

ハッシュ値から元のデータの推測ができないという利点を利用して、パスワード管理としてもハッシュ値を使われています。

そのままハッシュ化しても意味がない

たとえば、「password」をSHA-256でハッシュ化した場合
「5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8」
と表示されます。
これをgoogle先生に問い合わせみると簡単に「password」とばれます。

入力値とハッシュ値の対比を保管しているデータベースサイトがかなり多く、一般的に使われている値だとすぐにばれます。

そのため、 パスワード 管理にハッシュ化を用いる場合は、入力値の前後にランダムな文字列を付与(ソルト文字)したり、ハッシュ化を何千回~何万回実施(ストレッチング)することでセキュリティを確保するのが必至です。

-セキュリティ, セキュリティ
-,