ハッシュ化とは
ハッシュ化とは、元のデータから一定の計算手順に従ってハッシュ値と呼ばれる規則性のない固定長の値を求め、その値によって元のデータを置き換えること。パスワードの保管などでよく用いられる手法である。
IT用語辞典より
本来はファイルの改ざん、破損チェックに使用するのですが、パスワード管理用としても使われるようになっています。
最近ではパスワード管理としてハッシュ化したデータを保管するのがアプリケーションとして必須要件になってきてますね。
ハッシュ化の特性
どんな特性なのかを簡単に説明すると
- どんな大きなデータでも出力結果は一定(固定長)
- 指定されたルール(アルゴリズム)に従って結果を出力するため、同じデータの場合は必ず同じ結果になる。(1bitでもデータが異なると結果が変わる)
- 一方向性(不可逆)関数であること。(入力データから出力データに変換はできるが、出力データから入力データに変換することはできない)
- 弱衝突耐性(ハッシュ値から入力元データを探すのが困難)
- 強衝突耐性(ハッシュ値が同じ2つ以上の入力元データを探すのが困難)
ハッシュアルゴリズムの種類
ハッシュアルゴリズムは大きく「MD」、「SHA-0」「SHA-1」、「SHA-2」、「SHA-3」に分かれます。
アルゴリズム | ダイジェスト長 | ラウンド数 | セキュリティ強度 | |
---|---|---|---|---|
MD2 | 128bit | 18 | ||
MD4 | 128bit | 3 | ||
MD5 | 128bit | 4 | ||
MD6 | d(可変長) | 可変 | ||
SHA-0 | 160bit | 80 | 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ではファイル情報としてハッシュ値を表示しています。
![](https://kaede.jp/wp-content/uploads/2019/04/OSDN.png)
ほかにもPHPダウンロードサイトでもSHA256のハッシュ値が公開されています。
![](https://kaede.jp/wp-content/uploads/2019/04/php-download.png)
そのほかにgitにもハッシュ値が使用されていますね。
パスワード管理にも利用
ハッシュ値から元のデータの推測ができないという利点を利用して、パスワード管理としてもハッシュ値を使われています。
そのままハッシュ化しても意味がない
たとえば、「password」をSHA-256でハッシュ化した場合
「5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8」
と表示されます。
これをgoogle先生に問い合わせみると簡単に「password」とばれます。
![](https://kaede.jp/wp-content/uploads/2019/04/google-sha256.png)
入力値とハッシュ値の対比を保管しているデータベースサイトがかなり多く、一般的に使われている値だとすぐにばれます。
そのため、 パスワード 管理にハッシュ化を用いる場合は、入力値の前後にランダムな文字列を付与(ソルト文字)したり、ハッシュ化を何千回~何万回実施(ストレッチング)することでセキュリティを確保するのが必至です。