passwordを守るハッシュ法について
チャレンジレスポンス認証を教えてもらったからブログ書こうと思ったけど、書く事多くて怠そうだったので、まずハッシュ法についてまとめる事にした。
ハッシュって何?
- ハッシュ(hash)・ド・ビーフのハッシュと同じで肉を「細切れ」とか「散らす」みたいな意味
- データをある法則(ハッシュ関数など)に基づいて変換したもの
- webサービスとかではpasswordをハッシュにしてからDBに記録する
- passwordはUserしか知らないという状況と、サービスのDBの内容が漏洩してもすぐにpasswordが分からない様にする状況を作る為の手法
ハッシュ関数
データをハッシュにする関数で、大体の言語に各関数が用意されている
また、ハッシュ関数の良い特徴で「元のデータに戻せない」というのがある
MD5
- 歴史が長い関数だけど、よく使われる単語のhashなどは完全にバレてる
- rainbowテーブル(hashの辞書)が既に存在してる
SHA○○○
SHA1,256,512
があって、生成するハッシュの長さが違う- 扱うデータ量に応じて変えた方がいいらしい(違うデータなのに同じハッシュが出来てしまう可能性あるっぽい)
- そんな大規模なシステムじゃない限りは
SHA256
とかで充分っぽい
ハッシュ関数の問題
(サービス毎にhash関数を自作しないと危ない様な気がしてきた...)
そんな面倒くさいのを解決するのがSALTらしい
SALT
- 名前の通り、データに塩を振る感じでpasswordなどに決められたSALTデータを加えてハッシュ関数に突っ込む方法
- SALTがoppaiだとして、それをabcというpasswordに加えてハッシュ化すると、abcのハッシュ値がバレても少しは安全な気がする
- サービス毎に決めたSALTをfixedSALTという
SALTの問題点(まじかー)
- 色々なサービスで同じpasswordを使い回してる人が、あるサービスのpasswordを漏らしたりする
- いくら塩を振ったハッシュ値でも、その人のpasswordを入力した後のハッシュ値が分かってしまう
- 同じハッシュ値の人のpasswordがバレてしまう(迷惑だ...)
え、じゃあどうするの?
- User毎にランダムなSALT付ける(面倒そう)
- password+SALT+User名を組み合わせてハッシュ関数にぶっ込んだりする
- ストレッチングという何度もSALTを付けてハッシュ値をハッシュ関数にぶっ込む方法を使う
なんか色々な方法がある
バイナリデータの改ざんにも使える
チートと呼ばれているが、zipファイルなどゲーム内のアイテムやお金のデータが書いてあるバイナリファイル書き換える行為もハッシュ法を使えば防げるらしい。
(バイナリのハッシュデータをゲーム起動時にに確認するとか)
まとめ
こういうのって痛い目見ないと覚えなさそうだけど、先人達がこれらを理解してて、分かりやすく説明して貰えるのは恵まれてる事なのかなぁと思った。