🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

パスワード

パスワードは主に情報にアクセスする際に扱われます。主に、アクセス可能なユーザーを限定する手段として使われます。

Q&A

解決済

2回答

1255閲覧

Webアプリにおけるクライアントサイドでのストレッチングについて

_reNyu_

総合スコア1

セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

パスワード

パスワードは主に情報にアクセスする際に扱われます。主に、アクセス可能なユーザーを限定する手段として使われます。

0グッド

1クリップ

投稿2021/02/10 07:12

編集2021/02/10 08:03

(初めてで使い方がわからず変な文章を投稿してしまいすみません。編集依頼くださった方々ありがとうございました。)

前提

Webアプリケーションのパスワード送信・保存時におけるパスワードの不可逆暗号化(ハッシュ化)のストレッチングについてです。その他SSL/TSL,salt付与等は行うものとします。

Webアプリケーションのセキュリティについて様々なページを読んでいて、ストレッチングというものがあったのですが、これの目的はハッシュ化されたパスワードが漏洩した場合、処理に時間をかけることでパスワードの総当り(または辞書)攻撃を防ぐものだと理解しました。

質問の主題

ここで質問なのですが、「ストレッチングをする時サーバーの負荷と相談し回数を決定(多いほど良い)」と言われているようですが、これを負荷軽減のためにある程度クライアントで行い、これをパスワードとして認証するのはまずいのでしょうか。実装にもそこまでリスクはないですし、ユーザーから見た時間的な差異は大きくないと思います。

###具体例

パスワード入力から保存までの具体的な処理としては、

クライアント側
1, パスワードを入力(変数passとする)
2, passをハッシュ化する × 10,000回 (結果をpass_chとする)
3, pass_ch(とuserId)をSSL通信でサーバーに送る

サーバー側
4, salt値を決める
5, 送られてきたpass_chとsalt値を合わせてハッシュ化する(結果をpass_shとする)
6, pass_shとsalt(とuserId)をDBに保存する

が、自分の考えた処理です。具体例として提示しました。

###思いつくデメリットと解決策

自分の思いつくデメリットは、
①パスワードが適切なものかの判別(文字数が適切か,"aaaa","pass"等をはじく)が必ずしもできない
↑必然的にクライアントで判別することになるため、JavaScriptをいじられてしまったらパスワードが"aaaa"でも通ってしまう

なのですが、①に関してはわざわざJavaScriptをいじってまでパスワードを短くしたい人は少ないですし、そうした場合でもsaltを付与してハッシュしているのでレインボーテーブルもある程度無効化できると考えています。

###まとめ

よってストレッチングを、処理の集中するサーバーサイドで行わず、クライアントサイドで各々実行する事について、デメリット等あるのか質問させていただきます。またその他自分の認識で間違いがありましたら、御手数ですが教えていただけると嬉しいです。

長くなりましたが、有識者様の意見が聞きたく質問させて頂きました。拙い文章で申し訳ありません、よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2021/02/10 07:27

質問がデフォルトのままになっています。
m.ts10806

2021/02/10 07:28

質問は編集できます
_reNyu_

2021/02/10 07:46

失礼しました、教えて下さりありがとうございます????
ockeghem

2021/02/10 08:47

解決済みにするの早くないですか?もうちょっと意見を集めてもよいと思います
_reNyu_

2021/02/10 16:54

>ockeghem様 ありがとうございます、自分の認識不足が恥ずかしかったためすぐ解決済みにしてしまいました… もう少し意見募集させていただきます。
guest

回答2

0

ベストアンサー

ご指摘のような方法は採用されている例があります。私が知る限りでは、Lastpassのマスターパスワードがそのような方法で保護されています。以下は、北河 拓士さんによる解説の引用ですが、

マスターパスワードはデバイス側でPBKDF2-SHA-256(PBKDF2でハッシュ関数としてSHA-256を使用)の反復回数100,100回(デフォルト値、設定で変更可能)でハッシュ化され、更にPBKDF2-SHA-256の反復回数1回でのハッシュ化を行った後にサーバーに送信されます。サーバー側では、256bitsの乱数をsaltとし、 PBKDF2-SHA-256の反復回数100,000回でのハッシュ化を行い、更にGPUやASICでの解析にも強い鍵導出関数「scrypt」でハッシュ化され、認証ハッシュとして保存されます。ユーザー認証時には、同様の計算が行われサーバーに保存してある認証ハッシュとの比較が行われます。

おすすめのパスワード管理ソフトは? | Bizコンパス -ITによるビジネス課題解決事例満載!より引用

maisumakunさんから『攻撃者は「クライアントが送信するハッシュ値」を総当りするところからスタートできる』という指摘がありますが、現実にはこれは困難です。
なぜかというと、上記のようにSHA-256ハッシュをサーバーに送信する例で考えると、すべてのハッシュ値のとり得る値は 2^256 で 約 1.16e+77 通りあります。これに対して8桁英数字の総数は 62^8 で約2.81e14 で、1万回ストレッチすると、2.81e18回のハッシュ計算を要することになりますから、ハッシュ値での総当りは現実性がなく、結局パスワードから総当りした方がはるかに効率がよいことになります。

問題は、そのような方式の実現ノウハウが十分に共有されておらず、また信頼できるライブラリがない(知られていない)ことだと思います。なので、結論としては、サーバーサイドでストレッチした方が無難ということになります。

投稿2021/02/10 10:22

編集2021/02/10 10:30
ockeghem

総合スコア11705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

_reNyu_

2021/02/12 06:31 編集

回答ありがとうございます。 なるほど、似たような事例があったのは確認不足でした。サーバーでの処理軽減ではなくセキュリティの強化が目的のようですね。そちらの実装の方も詳しく勉強させていただきます。 256bitのハッシュ値を総当りすることについても計算すればパスワード自体の総当りの方が少ない計算回数であることは簡単に分かりましたね…自分でもしっかり考えてみようと思います。 また、ご指摘いただいた問題についてもよく検討させていただきます、ありがとうございました。
guest

0

「ストレッチングをする時サーバーの負荷と相談し回数を決定(多いほど良い)」と言われているようですが、これを負荷軽減のためにある程度クライアントで行い、これをパスワードとして認証するのはまずいのでしょうか。

そもそも論として、「そこでサーバ負荷軽減をする」という考え方自体が適切ではありません

処理時間をかかるようにするのは、「パスワードの検証自体にも一定の時間を消費するようにする」ことで、連続したパスワードで立て続けに検証することを阻止する、あるいはハッシュ値が手に入った場合に総当りで検証する手間を少しでも稼ぐためのものです。

処理負荷をクライアント側に移してしまえば、攻撃者は「クライアントが送信するハッシュ値」を総当りするところからスタートできるようになり、攻撃に対しては手薄となります

投稿2021/02/10 08:06

編集2021/02/10 08:08
maisumakun

総合スコア145973

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2021/02/10 08:15

ビットコインのようなProof of workシステムを取らない限り、攻撃者は「ハッシュ値を計算したふりをして適当な値を投げる」ことが可能です。
_reNyu_

2021/02/10 08:17

回答ありがとうございます。なるほど、回答くださった ・「(自分のサーバーの)『パスワードの検証自体にも一定の時間を消費するようにする』」 ・「攻撃者は『クライアントが送信するハッシュ値』を総当りするところからスタートできるようになる」 の2つのことについてどちらも盲点でした、とても分かりやすく説明して下さりありがとうございます。しっかり勉強し直そうと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問