ハッシュ関数とは
ハッシュ関数とは
Software Design 2017年6・7月号 ハッシュ関数を使いこなしていますか? の記事を読んで、 自分なりにまとめてみました
ハッシュ関数が持つべき特性
1. 同じデータを入力すると必ず同じハッシュ値を出力する 2. どんなデータを入力しても決まった長さのハッシュ値を出力する 3. 別のデータに対してはほぼ別のハッシュ値を出力する 4. ハッシュ値から元のデータを算出することはほぼできない
ハッシュ関数の利用例
1. AとCの特性を活かしたファイルの同一性チェック 2. BとCの特性を活かした推測しにくいURLの生成 3. AとDの特性を活かしたログインパスワードの保存
注意点
- レインボーテーブルを使用すると簡単に割り出されてしまうため、ハッシュ関数を使用する際は、 必ず入力データにソルトを付加し、衝突の可能性を考慮に入れる(ストレッチングすることが望ましい)
- ソルト ハッシュ値を計算する前にパスワードの前後に付け加える短い文字列 - ストレッチング ハッシュ値の計算を何回も繰り返すこと
ソルトはユーザごとに異なる文字列を付与すべき
例)userId + システム一意のランダム値パスワードのハッシュ化などはできるだけ既存の仕組みを使うのが望ましい(巨人の肩の上に立つ)
ハッシュと似た概念として、暗号化、難読化、エンコードがあるがすべて別の概念である
- 暗号化 暗号化は復号して元のデータに戻すことを前提としている 元のデータが長くなれば、暗号文も長くなる 「暗号化」に対する言葉は「復号化」ではなく、「復号」 「復号」は動詞に対し、「暗号」は名詞なので「化」を付けて動詞化している - 難読化 プログラムのソースコードを人間が読みにくいように変換すること 難読化されたソースコードはそのまま実行される - エンコード 特定のアルゴリズムでデータを別の形に変換すること 特定の文字列しか通せない経路に任意のデータを通す目的で使われる 変換されたデータはデコードすることで元のデータに戻すことができる 元のデータが長くなれば、エンコードされたデータも長くなる 暗号化と同様に、元のデータに戻すことを前提としているが、アルゴリズムを 知っていればデコードすることが可能なため、暗号文のつもりで使用してはいけない