「ハッシュ化したから安全」?

ハッシュからパスワードを入手できる

 ハッシュ化していれば、それほどまでに安全なのか。答えはノーだ。ハッシュ化したパスワードから、元のパスワードを入手するのは不可能ではない。


 それを説明するために、簡単にハッシュ化の仕組みをおさらいしておく。


 ハッシュ化は、あるデータをハッシュ関数と呼ぶ演算によって変換することを指す。変換したデータはハッシュと呼ぶ固定された長さの値になる。


 パスワードの保存に使うハッシュ関数には、2つの特徴がある。1つは、ハッシュから元のデータを演算で求める「復号」が困難であること。もう1つは、わずかでも違いがあるデータをハッシュ化すると、全く異なる値に変換されることである。


 このような特徴を持つハッシュ関数でパスワードのハッシュを保存すれば、認証が可能になる。
ハッシュを使ったユーザー認証
f:id:nonbei:20190403220451j:plain


 では、ハッシュからどうやって元のパスワードを入手するのか。それは、逆引きをするための表を使う。


 例えば、ある桁数までの文字列のハッシュをあらかじめすべて計算しておけば、元のパスワードがその桁数以下ならその逆引き表からすぐに候補を見つけられる。


 実際には、すべての文字列に対する逆引き表を用意すると、データが膨大になり過ぎる。そこで、特殊な関数と「レインボーテーブル」と呼ぶデータベースを組み合わせて、データサイズを小さくして逆引きできるようにしている。


工夫しても時間稼ぎになるだけ

 このため、ハッシュでは「ソルト」や「ストレッチング」と呼ぶ方法で解析しにくくしている。

 ソルトは、パスワードに文字列を付け加えてハッシュ化する手法。こうすれば、ハッシュ化する前のデータの桁数が増えて、解析に必要な逆引き表の作成が困難になる。


 ストレッチングは、ハッシュ化を繰り返し適用する手法だ。1回しかハッシュ化しないときより、解析の手間がかかるようになる。


 ただ両方の工夫を適用しても、解析に時間がかかるようになるだけだ。解析できなくなるわけではない。


 例えば、漏洩データの検索サービスを提供していたLeakedSourceが2016年9月、ソルトを採用していたサービスから漏洩した4350万件以上のアカウント情報を2時間で96%解析したとしている。


 ハッシュから元のデータを求めるサービスも登場している。逆引き表を用意できない人でも、こういったサービスでハッシュから元のパスワードを入手できる可能性がある。


 パスワードを漏洩させてしまったら、その組織はいち早く漏洩の事実を伝えて注意喚起を実施すべきだ。こうしてパスワードの使い回しによる二次被害を防ぐ。


 ハッシュ化していれば、その事実とソルトやストレッチングを適用していたかどうかも明らかにする。ユーザーの不安を無駄にあおらないようにするためだ。ただソルトの内容やストレッチングの回数は、攻撃者による解析の助けになるので公表しなくてもよい。

 ただし、ハッシュ化を根拠に安全だと主張すべきではない。その主張によって、安全だと誤解したユーザーが対処を後回しにすれば、被害が拡大する恐れがあるからだ。


ソ-ス:「ハッシュ化したから安全」と主張するのをそろそろやめようか | 日経 xTECH(クロステック)