アプリのプレーンテキストパスワードを置き換える

StackOverflow https://stackoverflow.com/questions/59022

  •  09-06-2019
  •  | 
  •  

質問

現在、所有している Web アプリのプレーン テキストのパスワードを保存しています。

私はパスワード ハッシュへの移行を提唱し続けていますが、別の開発者は、これは安全性が低くなると言いました。より多くのパスワードがハッシュに一致する可能性があり、辞書/ハッシュ攻撃がより速く行われる可能性があると述べました。

この議論には真実はあるのでしょうか?

役に立ちましたか?

解決

まったくありません。しかし、それは問題ではありません。以前にも同様の回答を投稿しました。

残念なことですが、人間は、たとえプログラマーであっても感情的すぎて、議論に簡単に流されません。一度彼が自分の立場に熱中すると(ここに投稿しているあなたもそうしているでしょう)、事実だけで彼を説得することは難しいでしょう。あなたがしなければならないのは、立証責任を切り替えることです。あなたは彼を連れ出して、彼があなたを納得させられるであろうデータを探してもらい、そうすることで真実を学ぶ必要があります。残念ながら、彼は現状の恩恵を受けているので、そこには厳しい道が待っています。

他のヒント

から ウィキペディア

一部のコンピューターシステムは、ユーザーのパスワードを保存し、それに対してユーザーログオンの試みをClearTextとして比較します。攻撃者がそのような内部パスワードストアにアクセスできる場合、すべてのパスワード、したがってすべてのユーザーアカウントが侵害されます。一部のユーザーが異なるシステムでアカウントに対して同じパスワードを使用している場合、それらも同様に侵害されます。

より安全なシステムは、各パスワードを暗号化されたフォームに保存するため、システムへの内部アクセスを獲得するスヌーパーにとって、実際のパスワードへのアクセスは依然として困難ですが、ユーザーアクセスの試みの検証は引き続き可能です。

一般的なアプローチは、Plantextパスワードの「ハッシュ」形式のみを保存します。ユーザーがこのようなシステムのパスワードを入力すると、パスワード処理ソフトウェアは暗号化ハッシュアルゴリズムを介して実行され、ユーザーのエントリから生成されたハッシュ値がパスワードデータベースに保存されているハッシュと一致する場合、ユーザーはアクセスを許可されます。ハッシュ値は、提出されたパスワードと通常、塩として知られる別の値で構成される文字列に暗号化ハッシュ関数を適用することによって作成されます。塩は、攻撃者が一般的なパスワードのハッシュ値のリストを作成することを防ぎます。MD5とSHA1は、頻繁に使用される暗号化ハッシュ関数です。

このページでは、このテーマに関してさらに多くのことを読むことができます。私の意見では、また私が読んだり扱ったりしたすべてのことを考慮すると、非常に小さな (< 256 ビット) アルゴリズムを使用しない限り、ハッシュの方が良いシナリオです。

Web アプリ上でプレーンテキストのパスワードを保持する言い訳はまったくありません。レインボー攻撃が不可能になるように、ソルト値を指定した標準のハッシュ アルゴリズム (MD5 ではなく SHA-1!) を使用します。

他の開発者が「より多くのパスワードがハッシュと一致する可能性がある」とどのように言っているのか理解できません。

「ハッシュ攻撃の方が速い」という議論もありますが、それはパスワードをハッシュするときにソルト処理をしていない場合に限ります。通常、ハッシュ関数を使用すると、既知のハッシュ テーブルの使用を時間の無駄にするソルトを提供できます。

個人的には、「ノー」と言います。上記と、何らかの方法でクリアテキストを公開した場合、ソルトされたハッシュ値は、侵入しようとする人にとってはほとんど価値がないという事実に基づいて。ハッシュ化には、すべてのパスワードが同じ長さに「見える」という利点もあります。

つまり、文字列をハッシュすると常に 20 文字のハッシュが得られる場合、ハッシュだけを確認する必要がある場合、元のパスワードが 8 文字だったのか、16 文字だったのかはわかりません。

私も職場でこれとまったく同じ問題に遭遇しました。ハッシュの方が安全であることを彼に説得するために私が行ったのは、サイトの公開セクションからユーザーとパスワードのリストを返す SQL インジェクションを作成することでした。それは重大なセキュリティ問題としてすぐにエスカレーションされました:)

辞書/ハッシュ攻撃を防ぐには、各ユーザーに固有で静的なトークン (ユーザー名/参加日/ユーザー GUID が適切に機能します) に対してハッシュするようにしてください。

パスワードにソルトを適用しない場合は、Rainbow Table 攻撃 (特定のハッシュに対して有効な入力が含まれるプリコンパイルされた辞書) の疑いがあります。

パスワードを平文で保存している場合、他の開発者はセキュリティについて話すのをやめて、セキュリティについて読み始めるべきです。

衝突の可能性はありますが、通常、パスワード アプリにとっては大きな問題ではありません (衝突は主に、ファイルの整合性を検証する方法としてハッシュが使用される領域で問題になります)。

それで:パスワードにソルトを付けて (パスワードの右側にソルトを追加*)、SHA-1、できれば SHA-256 または SHA-512 などの適切なハッシュ アルゴリズムを使用します。

追伸:ハッシュについてもう少し詳しく ここ.

*ソルトを文字列の先頭に置くべきか、それとも末尾に置くべきか少しわかりません。問題は、衝突(同じハッシュを持つ 2 つの入力)がある場合、「間違った」側に Salt を追加しても、結果のハッシュが変更されないことです。いずれにせよ、Rainbow Tables では大きな問題は発生せず、衝突が発生するだけです。

プログラマーが暗号学者のふりをするという古いことわざがあります:)

Jeff Atwood がこの件に関して良い投稿をしています: パスワードを間違って保存している可能性があります

さらに詳しく返信するには、上記のすべてに同意します。ハッシュを使用すると返信が簡単になります 理論的には 複数のパスワードが同じハッシュに一致するため、ユーザーのパスワードを取得します。ただし、これは、データベースにアクセスできる人よりも発生する可能性がはるかに低くなります。

確かに、何かをハッシュすると衝突が発生するため、2 つの異なるパスワードで同じアカウントのロックを解除できる可能性があります。

しかし、実際的な観点から見ると、これは不適切な議論です。優れたハッシュ関数 (md5 または sha1 で問題ありません) を使用すると、すべての意味のある文字列、特に短い文字列について衝突が発生しないことをほぼ保証できます。たとえあったとしても、1 つのアカウントに 2 つのパスワードが一致することは大きな問題ではありません。誰かがパスワードをランダムに推測して、侵入できる可能性が十分に高い場合は、より大きな問題が生じます。

私は、パスワードを平文で保存することは、パスワード照合におけるハッシュ衝突よりもはるかに大きなセキュリティ リスクをもたらすと主張します。

私はセキュリティの専門家ではありませんが、プレーン テキストの方が安全であれば、そもそもハッシュは存在しないのではないかと感じています。

理論的にはそうです。パスワードはハッシュよりも長く(情報量が多く)なる可能性があるため、ハッシュの衝突が発生する可能性があります。ただし、ほとんどの攻撃は辞書ベースであり、衝突の確率は直接一致が成功するよりも限りなく小さくなります。

それは何を防御するかによって異なります。攻撃者がデータベースをプルダウンする (またはアプリケーションをだましてデータベースを表示させる) 場合、プレーンテキストのパスワードは役に立ちません。SQL インジェクション、セッション ハイジャックなど、アプリケーションを説得してプライベート データを取り出すことに依存する攻撃が数多くあります。多くの場合、データをまったく保持しないで、悪意のある人が簡単に使用できないようにハッシュ バージョンを保持する方が良いでしょう。

同僚が示唆しているように、これは、辞書に対して同じハッシュ アルゴリズムを実行し、レインボー テーブルを使用して情報を取り出すことで簡単に破ることができます。通常の解決策は、シークレット ソルトと追加のユーザー情報を使用してハッシュ化された結果を一意にすることです。次のようなものです。

String hashedPass=CryptUtils.MD5("alsdl;ksahglhkjfsdkjhkjhkfsdlsdf" + user.getCreateDate().toString() +  user.getPassword);

ソルトが秘密であるか、攻撃者がユーザーのレコードの正確な作成日を知らない限り、たとえパスワード フィールドを取得できたとしても、辞書攻撃は失敗します。

プレーンテキストのパスワードを保存することほど安全なものはありません。適切なハッシュ アルゴリズム (少なくとも SHA-256、ただし SHA-1 でも何もしないよりは良い) を使用している場合、はい、衝突の可能性はありますが、与えられたハッシュを計算することは不可能*であるため、問題ではありません。文字列ハッシュ。ユーザー名をパスワードでハッシュすると、その可能性も排除されます。

* - 技術的には不可能ではないが、「計算的には実行不可能」

ユーザー名が「graeme」、パスワードが「stackoverflow」の場合、文字列「graeme-stackoverflow-1234」(1234 は乱数)を作成し、ハッシュして保存します。ハッシュ出力1234" がデータベースにあります。パスワードを検証する場合は、ユーザー名、提供されたパスワード、および保存された値の末尾からの番号 (ハッシュは固定長なので、いつでもこれを行うことができます) を取得し、それらを一緒にハッシュし、ハッシュと比較します。保存された値の一部。

より多くのパスワードがハッシュと一致する可能性があり、辞書/ハッシュ攻撃はより高速になります。

はいといいえ。SHA バリアントなどの最新のハッシュ アルゴリズムを使用すると、その議論は非常に難しくなります。ブルートフォース攻撃に 467 年かかるのではなく 352 年しかかからない場合、本当に心配する必要がありますか?(逸話的なジョークです。) 得られる価値 (パスワードがシステムに平文で保存されないこと) は、同僚の懸念をはるかに上回ります。

これに関して私が書いたソリューションをプラグインし、クライアント側の JavaScript を使用してパスワードを送信前にハッシュ化することをご容赦ください。 http://blog.asgeirnilsen.com/2005/11/password-authentication-without.html

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top