なぜ、「ハッシュ」「ソルト」「ストレッチング」が必要なのか?
ハッシュ、ソルト、ストレッチングってなーに?
え?そんなことも知らないんですか?
そう言わずに、教えてよぉ
分かりました。
ではまず、ユーザーのパスワードは、
DBにどうやって保管してますか?
ではまず、ユーザーのパスワードは、
DBにどうやって保管してますか?
そりゃもちろん、暗号化して保管してるよ~
あちゃ~。部長、それマジで言ってますか?
え?ダメなの?暗号化って完璧じゃないの?
暗号化は、カギが漏れれば復号できちゃうので、
残念ながら完璧じゃないです。
残念ながら完璧じゃないです。
そうすると、どうしたらいいの?
暗号化後の文字列を更にハッシュ化して、不可逆にしちゃって、
最悪の場合漏えいしても、復号できないようにするといいです。
最悪の場合漏えいしても、復号できないようにするといいです。
お、出てきた。ハッシュ化って?
とある文字列を、とある計算式に放り込むと、
不規則な文字列を生成できる仕組みのことです。
この文字列は、もとの文字列に戻すことはできません。
不規則な文字列を生成できる仕組みのことです。
この文字列は、もとの文字列に戻すことはできません。
ん?じゃー、パスワードの比較ができなんじゃ?
入力されたパスワードと
DBに保管されているパスワードは比較しません。
というか不可逆なのでできません。
入力されたパスワードもハッシュ化して
そのハッシュ化された文字列同士を比較します。
DBに保管されているパスワードは比較しません。
というか不可逆なのでできません。
入力されたパスワードもハッシュ化して
そのハッシュ化された文字列同士を比較します。
おー、なるほどねぇ。
そうすると、元のパスワードは保持していないから漏えいしても大丈夫だけど、
パスワードで認証ができるんだね。
そうすると、元のパスワードは保持していないから漏えいしても大丈夫だけど、
パスワードで認証ができるんだね。
さらにここでソルトやストレッチングもやっちゃいます。
おっ、急に出てきた。ソルトやストレッチングってなーに?
ソルトは、その名の通り「塩」なイメージですw
ハッシュ化する前の文字列に、ランダムに生成した文字列をくっつけてから、ハッシュ化します。
「パスワード」+「ソルト文字列」→ハッシュ化
ハッシュ化も完全では無いので、元の文字列が長ければ、それだけでも攻撃耐性があがるので有効です。
さらに、この付与するソルトは、ユーザ毎に異なる文字列にします。
そうると、たまたま同じパスワードを使っている人同士でも、DB上のハッシュ値が異なり、より安全です。
ハッシュ化する前の文字列に、ランダムに生成した文字列をくっつけてから、ハッシュ化します。
「パスワード」+「ソルト文字列」→ハッシュ化
ハッシュ化も完全では無いので、元の文字列が長ければ、それだけでも攻撃耐性があがるので有効です。
さらに、この付与するソルトは、ユーザ毎に異なる文字列にします。
そうると、たまたま同じパスワードを使っている人同士でも、DB上のハッシュ値が異なり、より安全です。
ほぉ~。凄いこと考える人がいるもんだねぇ。そしてストレッチングとは?
最初の方で、ハッシュ化の話をしたと思いますが、このハッシュ化を繰り返し行うことで、より強固なハッシュ値にするのがストレッチングです。
「パスワード」+「ソルト文字列」→ハッシュ化
→ハッシュ化→ハッシュ化・・・
これを数千回から数万回繰り返します。
「パスワード」+「ソルト文字列」→ハッシュ化
→ハッシュ化→ハッシュ化・・・
これを数千回から数万回繰り返します。
数千から数万か。すごいな。
コンピュータは人間と違って、繰り返し同じことするの得意ですからw
ほぉ。なるほどねぇ。