質問: 例えばdevise等の認証系ライブラリではパスワードを登録した際にその文字列がハッシュ化されDBに格納していると思います。 例えばログインする際、暗号化であれば例えばBASE64などは一定の法則があって復号化が可能で、DBに入っている文字列を復号化し入力した値を照らし合わせるということが出来ると思うのですが、非可逆なハッシュ文字列を用いて認証を出来る意味が良く分かりません。 同じ文字列をハッシュ化しても同じハッシュ化された文字列にはなりませんよね? よろしくお願い致します。
回答: [追記] 一般的なユーザー登録と認証の概要だけの説明です。 セキュリティめっちゃ大事なので、概要をつかめたら是非他の人のアンサーを読んで考えてみたり、 devise本体の実装も読んでみてください。 ※前提としてハッシュ関数は一方向の関数であり、同じ文字列を同じアルゴリズムでハッシュ化すると必ず同じハッシュ値が得られます。 ### ステップ1:ユーザー登録時 仮にパスワードに`abc`という文字列を指定するとします。 `abc`という文字列をSHA256でハッシュ化すると`BA7816BF8F01CFEA414140DE5DAE2223B00361A396177A9CB410FF61F20015AD` という不可逆な文字列になるので、これをDBに登録しておきます。 ### ステップ2:ログイン時 ユーザーはログインする時にパスワードに`abc`という文字列を指定します。 プログラムは`abc`という文字列を同じアルゴリズム、この場合はSHA256でハッシュ化して、`BA7816BF8F01CFEA414140DE5DAE2223B00361A396177A9CB410FF61F20015AD`という文字列を作り、DBに登録されている文字列`BA7816BF8F01CFEA414140DE5DAE2223B00361A396177A9CB410FF61F20015AD`と比較します。 この場合2つの文字列は一致しているので、プログラムは「正しいパスワードが入力された」とみなすことができます。 DBにはハッシュ関数でハッシュ化された不可逆な情報しか登録されていないので、万が一漏洩した場合でも、本当のパスワード`abc`を知ることができません。 ### 補足 ハッシュ化された値は不可逆ですが、SHA256でハッシュ化すると`abc`は`BA7816BF8F01CFEA414140DE5DAE2223B00361A396177A9CB410FF61F20015AD`という値になるよねということは周知の事実です。 世の中にはいろんな人がいて、入力値とハッシュ値のペアのデータベースを作成している人がいます。 そういったデータベースにはレインボーテーブルという名前がついています。 このデータベースを参照すると、ハッシュ値から元の入力値を調べることが可能だったりするので、ソルトという方法を使ってレインボーテーブルを参照する攻撃を回避します。 ソルトもよければ調べてみて下さい。