例えばdevise等の認証系ライブラリではパスワードを登録した際にその文字列がハッシュ化されDBに格納していると思います。
例えばログインする際、暗号化であれば例えばBASE64などは一定の法則があって復号化が可能で、DBに入っている文字列を復号化し入力した値を照らし合わせるということが出来ると思うのですが、非可逆なハッシュ文字列を用いて認証を出来る意味が良く分かりません。
同じ文字列をハッシュ化しても同じハッシュ化された文字列にはなりませんよね?
よろしくお願い致します。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答7件
0
ベストアンサー
[追記]
一般的なユーザー登録と認証の概要だけの説明です。
セキュリティめっちゃ大事なので、概要をつかめたら是非他の人のアンサーを読んで考えてみたり、
devise本体の実装も読んでみてください。
※前提としてハッシュ関数は一方向の関数であり、同じ文字列を同じアルゴリズムでハッシュ化すると必ず同じハッシュ値が得られます。
ステップ①:ユーザー登録時
仮にパスワードにabc
という文字列を指定するとします。
abc
という文字列をSHA256でハッシュ化するとBA7816BF8F01CFEA414140DE5DAE2223B00361A396177A9CB410FF61F20015AD
という不可逆な文字列になるので、これをDBに登録しておきます。
ステップ②:ログイン時
ユーザーはログインする時にパスワードにabc
という文字列を指定します。
プログラムはabc
という文字列を同じアルゴリズム、この場合はSHA256でハッシュ化して、BA7816BF8F01CFEA414140DE5DAE2223B00361A396177A9CB410FF61F20015AD
という文字列を作り、DBに登録されている文字列BA7816BF8F01CFEA414140DE5DAE2223B00361A396177A9CB410FF61F20015AD
と比較します。
この場合2つの文字列は一致しているので、プログラムは「正しいパスワードが入力された」とみなすことができます。
DBにはハッシュ関数でハッシュ化された不可逆な情報しか登録されていないので、万が一漏洩した場合でも、本当のパスワードabc
を知ることができません。
補足
ハッシュ化された値は不可逆ですが、SHA256でハッシュ化するとabc
はBA7816BF8F01CFEA414140DE5DAE2223B00361A396177A9CB410FF61F20015AD
という値になるよねということは周知の事実です。
世の中にはいろんな人がいて、入力値とハッシュ値のペアのデータベースを作成している人がいます。
そういったデータベースにはレインボーテーブルという名前がついています。
このデータベースを参照すると、ハッシュ値から元の入力値を調べることが可能だったりするので、ソルトという方法を使ってレインボーテーブルを参照する攻撃を回避します。
ソルトもよければ調べてみて下さい。
投稿2019/11/13 09:56
編集2019/11/19 15:04総合スコア152
0
BAが決まってますが、凄く勘違いしていそうですし、セキュリティ上問題がある方法だけが示され続けるのも問題と思いますので…。
パスワードを登録した際にその文字列がハッシュ化されDBに格納していると思います。
質問においてこの部分が間違っています。完全に間違っているわけでは無く、正確にはこうです。
「パスワードを登録した際にその文字列とランダムに生成するソルトを組み合わせたものがハッシュ化されソルトと一緒にDBに格納している」
ソルトを使用しない方式(LDAP passwordの{MD5}と{SHA}とかわざとそうしている実装はある)や、バグでソルトが常に同じになる(実際にそういう製品があった)場合は、レインボーテーブル攻撃に脆弱になるといったセキュリティ上問題があるため、使用すべきではありません。deviseを含めた認証ライブラリの実装ではソルトは必ず使用しています。これらの実装では、登録時は、例え同じパスワードであっても、毎回ランダムに生成された異なるソルトが使用され、結果毎回異なるハッシュ値が生成され、DBにはソルトとハッシュ値の両方が保存されています。認証時は、パスワードとDBにあるソルトからハッシュ値を生成し、DB上のハッシュ値と比較するという方法を取っています。
投稿2019/11/15 23:50
総合スコア21737
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/16 03:04
退会済みユーザー
2019/11/16 03:11
2019/11/19 00:14
退会済みユーザー
2019/11/19 01:25
退会済みユーザー
2019/11/21 23:47
2019/11/22 09:57
退会済みユーザー
2019/11/22 20:59
0
厳密に言えばハッシュは暗号ではありません。
暗号は「復号できなければならない」ので、一方向・多対一変換であるハッシュは暗号たり得ません。
ハッシュは「与えられたデータを、何らかの法則に従って計算した結果」であって、
- 同じ入力だと同じハッシュ値が返ってくる
- 違う入力に対しては基本的には別のハッシュ値が返ってくる
- 違う入力に対して、同一のハッシュ値が返ることはある(ハッシュの衝突)
特性を持っています。
そこで、データそのものを比べるのではなく、データから計算したハッシュ値を比べることで、「ほとんどの場合」入力の同一性をチェックすることに使える、というものです。
※加えてハッシュ値計算の手間はかかるものの、データそのものを全部比べるより資源を必要としないという利点があります
投稿2019/11/14 01:23
総合スコア13703
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/14 01:32
0
例えばログインする際、暗号化であれば例えばBASE64などは一定の法則があって復号化が可能で、DBに入っている文字列を復号化し入力した値を照らし合わせるということが出来る
出来るといえば出来ますが、復号はしないのです。
同じようにハッシュ値を計算してそれが一致することを確認するだけです。
ハッシュ値にしているのは、単に平文のパスワードだと盗まれたらそのまま使われるからです。
ハッシュ値なら元のパスワードや同じハッシュ値になる文字列を探すのが困難になります。
困難さはアルゴリズムによって変わります。
同じ文字列をハッシュ化しても同じハッシュ化された文字列にはなりませんよね?
なります。
投稿2019/11/13 10:24
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/21 23:38
退会済みユーザー
2019/11/21 23:44
退会済みユーザー
2019/11/21 23:51 編集
2019/11/21 23:47
2019/11/21 23:52 編集
退会済みユーザー
2019/11/21 23:54
2019/11/21 23:57
2019/11/22 00:00
退会済みユーザー
2019/11/22 00:03
2019/11/22 00:04
退会済みユーザー
2019/11/22 00:06
2019/11/22 00:07
2019/11/22 00:08
2019/11/22 00:08
2019/11/22 00:12
退会済みユーザー
2019/11/22 00:14
2019/11/22 00:18
退会済みユーザー
2019/11/22 02:09
退会済みユーザー
2019/11/22 02:32
退会済みユーザー
2019/11/22 02:37
退会済みユーザー
2019/11/22 02:40
退会済みユーザー
2019/11/22 02:42
退会済みユーザー
2019/11/22 02:47
退会済みユーザー
2019/11/22 02:51
退会済みユーザー
2019/11/22 03:04
退会済みユーザー
2019/11/22 03:16
退会済みユーザー
2019/11/22 03:28
退会済みユーザー
2019/11/22 03:35
退会済みユーザー
2019/11/22 03:47
退会済みユーザー
2019/11/22 03:54
退会済みユーザー
2019/11/22 03:57
退会済みユーザー
2019/11/22 04:01 編集
退会済みユーザー
2019/11/22 04:01
退会済みユーザー
2019/11/22 04:02
退会済みユーザー
2019/11/22 04:06
退会済みユーザー
2019/11/22 04:09 編集
2019/11/22 04:13
退会済みユーザー
2019/11/22 04:13
退会済みユーザー
2019/11/22 04:14
2019/11/22 04:20
退会済みユーザー
2019/11/22 04:25 編集
退会済みユーザー
2019/11/22 04:31
2019/11/22 04:33
2019/11/22 04:34
退会済みユーザー
2019/11/22 04:45
2019/11/22 04:47
2019/11/22 04:49
退会済みユーザー
2019/11/22 04:50
退会済みユーザー
2019/11/22 05:11
2019/11/22 05:13
2019/11/22 05:15
退会済みユーザー
2019/11/22 05:16 編集
2019/11/22 05:18
2019/11/22 05:19
2019/11/22 05:20
退会済みユーザー
2019/11/22 05:25
2019/11/22 05:26
退会済みユーザー
2019/11/22 05:33
2019/11/22 05:35 編集
退会済みユーザー
2019/11/22 05:40
2019/11/22 05:42 編集
2019/11/22 05:44
退会済みユーザー
2019/11/22 05:54
2019/11/22 05:55
2019/11/22 06:03 編集
2019/11/22 05:57
2019/11/22 06:00
退会済みユーザー
2019/11/22 06:04
2019/11/22 06:07
退会済みユーザー
2019/11/22 06:10
2019/11/22 06:16
退会済みユーザー
2019/11/22 06:21
2019/11/22 06:23
2019/11/22 06:25 編集
2019/11/22 06:30
退会済みユーザー
2019/11/22 06:36
2019/11/22 06:37
2019/11/22 06:41
退会済みユーザー
2019/11/22 06:46
退会済みユーザー
2019/11/22 07:05
2019/11/22 07:11 編集
退会済みユーザー
2019/11/22 07:11
2019/11/22 07:21 編集
退会済みユーザー
2019/11/22 07:20
退会済みユーザー
2019/11/22 07:22
2019/11/22 07:23
2019/11/22 07:25
退会済みユーザー
2019/11/22 07:32
退会済みユーザー
2019/11/22 07:33
退会済みユーザー
2019/11/22 07:35
2019/11/22 07:38 編集
退会済みユーザー
2019/11/22 07:39
退会済みユーザー
2019/11/22 07:44
2019/11/22 07:46
退会済みユーザー
2019/11/22 07:52
退会済みユーザー
2019/11/22 07:52
退会済みユーザー
2019/11/22 07:59
退会済みユーザー
2019/11/22 08:09
退会済みユーザー
2019/11/22 08:16 編集
2019/11/22 08:19
2019/11/22 08:22
退会済みユーザー
2019/11/22 08:36
退会済みユーザー
2019/11/22 08:39
退会済みユーザー
2019/11/22 08:51
退会済みユーザー
2019/11/22 08:55
退会済みユーザー
2019/11/22 09:10
0
参考情報
- パスワードハッシュ化で用いるソルト(Salt)とペッパー(Pepper)/シークレットソルト(Secret Salt)の役割と効果
https://qiita.com/shioshiota/items/d439e63c4ee651d956ab
...
Saltの役割は下記の二種類です。
同じパスワードでも算出されるハッシュ値が異なるようにすること
一方向関数への入力文字列を長くすること
...
- deviseで使用しているbcryptによるencrypted_passwordの挙動
https://qiita.com/kenjiszk/items/d38e398bc120cf4bbd1c
...
ログイン時にデータベースに保存されているencrypted_passwordと、ユーザーが入力して来た平文のパスワードの比較をする為に以下のメソッドが定義されている
...
投稿2019/11/15 23:18
総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
どのような文字列も同じ文字列をハッシュ化すれば常に同じになります。
対して同じ文字列を暗号化したらその都度変わってしまいます。
ちなみに暗号化がその都度変わる実験はこちらを参考にしてください。
投稿2019/11/13 09:43
編集2019/11/13 11:19総合スコア10429
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/13 09:45
退会済みユーザー
2019/11/13 10:47
2019/11/13 10:58
退会済みユーザー
2019/11/13 14:23 編集
退会済みユーザー
2019/11/13 15:17 編集
退会済みユーザー
2019/11/13 15:05
退会済みユーザー
2019/11/13 15:17 編集
退会済みユーザー
2019/11/13 15:22
2019/11/13 23:19
退会済みユーザー
2019/11/14 00:16
2019/11/14 00:18
退会済みユーザー
2019/11/14 00:23
2019/11/14 00:25
退会済みユーザー
2019/11/14 00:34
2019/11/14 00:52 編集
退会済みユーザー
2019/11/14 00:53
退会済みユーザー
2019/11/14 01:31
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/14 09:21