情シス/社内SEのためにハッシュの基礎まとめ
セキュリティの話題が出るとたまに『ハッシュ関数』という言葉が出てきますが、あまりよく知られていない側面もあります。
そこで今回は一問一答形式で情シス/社内SEにとって有用なハッシュの基礎知識をまとめてみました。
※超ざっくりなので一部正確ではない箇所がありますがご了承願います。
ハッシュの意味ってなに?
『形あるものをぐちゃぐちゃに混ぜること』です。ハッシュドビーフとかハッシュドポテトのハッシュと意味は同じ。
じゃがいもからハッシュドポテトは作れますが、ハッシュドポテトからじゃがいもは作れません、ここ重要。
ハッシュの特徴は?
入力が同じでアルゴリズムが同じなら同じ結果になります
結果を逆計算して入力を得ることはできません(このことから一方向性関数ともいわれます)
入力が違うのに同じ結果になる(衝突といいます)確率は超低いです(ゼロではない)
ハッシュと暗号化の違いは?
暗号化は復号化、つまり元に戻せます。ハッシュは戻せません。
ハッシュはどうして戻せないの?
詳細は割愛しますが、論理演算のXORの特徴を利用します。XORの入力A=1、B=0だと出力Y=1ですが、出力がY=1だからといってA=1、B=0とは限りません。A=0、B=1かもしれません。どっちが正解なのかはY=1という情報だけでは絶対に分かりません。つまり出力から入力は分かりません。
ダウンロードサイトにファイルのハッシュ値があるけどなんのため?
ファイルにマルウェアがくっついてたり改ざんされていないことを確認するためです。ファイルをダウンロードした後でファイルのハッシュを計算して、サイトに記載のハッシュと一致すればファイルは改ざんされていません。不一致だと改ざんとか悪いプログラムがくっついてる可能性大です。
ハッシュ関数はどんなのがあるの?
SHA1、MD5:今は脆弱性があるので認証系に使われることはほぼありません。ファイルの真正性を確認するために使われることが多いです。
SHA2:SHAのバージョン2。SHA256とかSHA512はSHA2の一部で、256や512は『アウトプットが必ず256/512bitになるよ』という意味。
SHAって何て読むの?
西・・・じゃなかった”シャー”ってよく言われます。別に”エスエイチエー”でも私は何とも思いません。
データ長の違うインプットをしてもなんでアウトプットが同じ長さになるの?
インプットを固定長に分割します。1000bitをSHA256にインプットすると、データは256*3+232に分割されます。232は256より小さいので、232bitのデータに24bitのデータをくっつけて(パディングといいます)長さ256bitのデータを4つ準備します。
あとはこの4つのデータをXORしたり切ったり貼ったりこねくり回して1000bitから256bitのSHA256値を計算します。
入力が1Mbitだろうが1Gbitだろうがやることは同じです。もちろん、長いデータを入力すると計算量はどんどん多くなるので計算に時間がかかるようになります。
ハッシュが衝突すると何がまずいの?
いろんなパスワードはよくハッシュ値で保存されます。ハッシュの衝突がおきると、あなたが設定したパスワードとは違うパスワードで認証が可能になります。
なんでパスワードをハッシュ値で保存するの?
ハッシュは漏れてもパスワードは漏れないから。攻撃者がハッシュを不正に取得してもパスワードはわかんないので不正ログインはできません。
パスワードとハッシュ値が1対1で紐づくならハッシュ値からパスワードを逆算できるよね?
これはまさしくその通り。でも逆算されないようにハッシュ化するときに一工夫できます。
”パスワード”だけをハッシュ化するのではなく、”パスワード+ユーザーID”とか”パスワード+設定時刻”とか”パスワード+乱数”をハッシュ化すれば大丈夫。
逆算するには”なんのパスワードが何のハッシュになるか”という膨大なリストが必要だけど、+なにかでハッシュ化することで現実的にリストを作ることが不可能になる。
なお、この”+なにか”のことをソルトと言ったりします。ハッシュドビーフに塩振りかけて味付しているとでも思ってください。
ハッシュの計算って誰でもできるの?
XORと四則演算と剰余算ができれば誰でもできます。やり方は普通にネットに公開されてます。
計算方法が公開されててセキュリティ的に大丈夫なの?
頭のいい人が計算方法の弱点を見つけてくれることがあるので、むしろ公開してる方が安全です。
情報セキュリティは計算方法を公開して広くいろんな人にまずいところが無いか見てもらうことで安全性と信頼性を担保することがよくあります。
そもそも公開しないと世間で広く使ってもらえないし。
まとめ
- ハッシュは元に戻せません
- 違う入力で同じハッシュが出てくることはほぼありません
- ハッシュのことを考えるとハッシュドビーフを食べたくなってきます