web-dev-qa-db-ja.com

既存のすべての顧客パスワードを暗号化する方法

私はオンラインショップで働いており、ここで働いて以来、顧客のパスワードをプレーンテキストで保存しています。私はデータ入力者として入社しました。これを行ったことがわかったとき、私は経営陣にフラグを立てましたが、彼らは興味も関心もないようでした。数年後、私はWebサイトを担当し、今ではすべてのお客様のパスワードを暗号化したいと考えています。

.NET eコマースWebサイトのすべての顧客パスワードを暗号化する最も速くて簡単な方法は何ですか?利用できる.NETライブラリはありますか?

編集する

現在、暗号化やパスワードのセキュリティについてはほとんど何も知りません。私はこの質問を投稿する前に調査を行っていないと非難されています。今日、私は実際にこのトピックの研究を始めており、この質問は私の研究の一部です。人々が私の知識の欠如に腹を立てているのは残念ですが、それは怠惰ではありません。私は単にこの分野について何も知らないので、今それを見つけようとしています。この質問はその一部です。どうぞよろしくお願いいたします。

7
Mike

パスワードは暗号化するのではなく、ソルト化してハッシュ化する必要があります。事前計算攻撃を軽減するには、低速ハッシュを使用する必要があります。ここに.NETコードがあります: https://crackstation.net/hashing-security.htm

追加用に編集:アカウントの数が少ない場合は、ハッシュコードの実行中にログイン試行を単にブロックできる可能性があります。ただし、速度が遅くなるように設計されているため、パスワードがハッシュされている間はログインを許可する必要がある場合があります。それは問題ありません。最初に平文のパスワードを比較します。一致しない場合は、提示されたパスワードをハッシュして、もう一度比較します。

ハッシュだけでなくソルトも保存する必要があることを忘れないでください。データベーススキーマを変更しない場合は、varcharであると仮定して、それらを連結して既存のパスワードフィールドに格納できます。それ以外の場合は、データベースに列を追加し、ハッシュ計算が完了してコミットされた後にプレーンテキスト列をクリアする必要がある場合があります。

パスワード回復メカニズムを確認してください。これを行うと、ユーザーにパスワードが何であるかを伝えることができなくなります。他の回復メカニズムが必要になります。

質問には関係ありませんが、ログインにTLSを使用していない場合は、そうする必要があります。

5
Bob Brown

.Netが提供するパスワードハッシュの最適なオプションはPBKDF2で、CodesInChaosがコメントしたようにSystem.Security.Cryptography.Rfc2898DeriveBytesとして実装されています。

あなたがしなければならない本当の選択は、これがonlyアカウント/パスワード管理コードの必要な変更であるかどうかです。もしそうなら、あなたはそれを直接実装して、現在のパスワード管理を置き換えることができ、それでそれを行うことができます。

ただし、資格情報の管理方法に他の問題がある場合(およびプレーンテキストのパスワードストレージの場合、これは可能性が高いと思われます)、アカウント管理を完全に抽象化し、使用するアプリケーションをリファクタリングすることをお勧めします代わりにASP.NET Identity。これにより、デフォルトでPBKDF2ベースのパスワードハッシュが提供され、パスワードのリセット、ブルートフォース攻撃を防止するためのアカウントロックメカニズム、およびその他の多くのセキュリティ上の利点などの既製のソリューションも提供されます。

3
Xander

パスワードを暗号化するよりも、ハッシュする方が良い方法です。基本的に、ハッシュは一方向のメカニズムですが、暗号化は元に戻すことができます。

なぜこれが重要なのですか?さて、悪意のあるエンティティ(従業員である可能性があります)がデータを暗号化した方法(ブルートフォースまたはキーを盗むなど)を見つけた場合、それらはデータを解読できます。そのうち他の場所(他のサイト、電子メール、銀行など)で再利用されます。このような違反は、サイト/会社の評判を損なうことになります。

ハッシュを使用すると、ハッシュされた値がどのように生成されたかを知ることができますが、それを生成した値(パスワード)はわかりません。もちろん、ログオン時のサーバー間の通信を保護しているのでない限り(たとえば、HTTPS WebページではなくHTTP)。 *

このプロセスの一部として、パスワードもソルトする必要があります。

暗号化では、ソルトはランダムなデータであり、パスワードまたはパスフレーズをハッシュする一方向関数への追加入力として使用されます。[1] saltの主な機能は、パスワードハッシュのリストではなく、辞書攻撃を防ぐことです。

出典: http://en.wikipedia.org/wiki/Salt_%28cryptography%29

繰り返しますが、非常に基本的に、これは攻撃者が既知の/一般的な(パス)ワードのリストを取得し、「letmein」と言ってハッシュする場所です。彼らがパスワード「letmein」に対応するハッシュを知っており、ユーザーのいずれかが同じパスワードハッシュを持っているかどうかをすばやく検索できることを知っています。明らかに、これは可能な/一般的な(パス)ワードの「辞書」を使って自動化するのが非常に簡単です。塩漬けは、このシナリオを防ぐのに役立ちます。

.NETでの実装方法については、スタックオーバーフローからのこの質問(および回答)を参照してください。

https://stackoverflow.com/questions/19957176/asp-net-identity-password-hashing

私は.NET開発にあまり精通していませんが、@ jd4uからの回答によると、デフォルトの実装では、ハッシュを生成するときにユーザーのパスワードに加えてソルトが使用されます。

*サイトのページ(少なくともログオン)が安全な接続でまだ提供されていない場合は、これも実行してください。

0
Michael