私は多くの「低品位」情報を保持しているシステムを管理しています。名前、住所、電子メールなど、財務的なものは何もありません。誰かが、現在の社内パスワード暗号化アルゴリズムからセキュリティを上げて、ICO推奨のハッシュ/塩を使用することを提案しました。私は少し読んで、その利点を理解するのに苦労しています。私の議論は、これを提案している「専門家」に戻りましたが、彼らは私の非常に単純な質問に答えません(できない)。
私の知る限り、ハッシュ/ソルトは、ハッカーによるパスワードの読み取りと解読を防止します。これには優れており、引数はありません。しかし、何か欠落していない限り、パスワード値を読み取るために、ハッカーはデータベースにアクセスしてパスワード値を盗む必要がありますか?...データベースにアクセスできる場合、実際には必要ありません。彼らはデータベースから直接データを盗むことができるので、パスワードはパスワードを取得します。つまり、彼らがパスワードから取得するアプリケーションアクセスは、データベースを直接読み取る以外の何も与えません。
何が欠けていますか?
ユーザーは複数のサイトで同じパスワードを使用することがよくあります。あなたのサイトには財務データがないかもしれませんが、銀行やオンラインストアに同じパスワードが使用されている場合はどうでしょうか?
これはあなたの問題ではないと主張することもできますが、これは一般的な問題であり、違反が発生した場合は常に、「パスワードを変更して、他のサイトでパスワードを変更してください」同じパスワード」。
サイトがBcryptのようなものを使用している場合(実装に欠陥がない-Ashley Madisonを参照)、攻撃者が使用されているパスワードを突き止められる可能性はより低く、ユーザーが自分のパスワードを変更できる時間が増加します他の場所のパスワード。ハッシュなしでパスワードをDBに保存するだけの場合、攻撃者は電子メールアドレスとパスワードを探し出し、すぐに別のサイトへの攻撃を開始できます。
メールアドレスとパスワードのペアは、「コンボリスト」の形式で攻撃者間で交換されることもよくあります。つまり、元の攻撃者があなたのサイトにのみ興味がある場合でも、データを誰かに売ることで利益を得ることができる可能性がありますそうしないと。
双方向暗号化ストレージに関する質問へのコメントに応じて追加
双方向の暗号化アプローチの問題は、復号化する情報をシステムのどこかに保存する必要があることです。攻撃者がデータベースにアクセスした場合、攻撃者が暗号化キーにもアクセスできる可能性が高くなります。この方法でハッシュを元に戻すことはできません。ハッシュを元に戻すためのオンラインツールは、事前に計算されたリストでハッシュを効果的に検索します。
暗号化キーを持っていない場合でも、キーが何であるかを把握できる可能性があります。システムへのパスワードを入力して結果を確認することで、既知のプレーンテキスト攻撃を利用できます。それはおそらく迅速なプロセスではありませんが、データ(著名人、政治家など)に価値の高いターゲットがある場合は、実行する価値があります。
一方、強力なソルトハッシュでは、元のパスワードを確実に見つける唯一の方法は、適切なソルトを使用して、可能なすべての入力をハッシュすることです。 Bcryptのようなものでは、弱いパスワードが比較的迅速に見つかる可能性はありますが、これには数年かかります。
良い質問です。あなたが聞いてよかったです。 Googleがこのスレッドを見つけて、他の多くの企業が犯すのと同じ間違いを犯さないようにしてほしいと思います。
hash
のパスワードだけでなく、salt
のパスワードを使用して、ハッシュアルゴリズムで何らかのSlowEquals
を使用する必要があります。ここで止めるべきではありません。bcryptやscryptなど、安全性の高いハッシュアルゴリズムresist collisions
を使用する必要があります。
Md5は非常によく知られているので、例として使用します。 衝突に対して脆弱であり、非常に高速であるため、使用しないでください、つまり、破るのがはるかに簡単です。塩を使わずにパスワードをハッシュすることを想像してみてください。ほぼ毎回静的出力を生成することになります。
たとえば、「myDarnPassword
」は、md5としてハッシュされると、「aca6716b8b6e7f0afa47e283053e08d9
」に変換されます。この時点で、辞書攻撃を作成し、レインボーテーブルを使用できます。ランダムな数の文字を簡単に検索できるデータベースに変換するデータベースを生成して、時間のかかるRainbowテーブルルックアップを必要としないようにすることもできます。時間をかけてゆっくりと作成し、後でハッシュを調べることができます。
次のようなテーブルを作成します。
+-------------------+----------------------------------+
| PASSWORD | UNSALTED_HASH |
+-------------------+----------------------------------+
| myDarnPassword | aca6716b8b6e7f0afa47e283053e08d9 |
+-------------------+----------------------------------+
| pleaseDontSueMe11 | 0dd395d0ec612905bed27020fb29f8d3 |
+-------------------+----------------------------------+
次に、データベースから次のように選択します。
SELECT [password] FROM [table] WHERE [unsalted_hash] = 'aca6716b8b6e7f0afa47e283053e08d9'
そして、myDarnPassword
、plusが発生した衝突を返します。
十分な処理能力と時間があれば、何兆もの組み合わせを作成でき、非常に短時間で多数のパスワードを簡単にクラックできます(データベースの数が多いため、データベースをパスワードの長さに分割することをお勧めします)。ただし、これには膨大な量のハードドライブ容量が必要になります。
その時点で、あなたが本当にしなければならないことは、毎回ブルートフォースすることで処理能力を無駄にすることなくそれを調べることです。また、過去に他の人のパスワードをデータベースから盗んだことがある場合は、それらを追加してハッシュに変換できます。多くのウェブサイトはすでにこれを行っています。
ウェブサイトがあなたのパスワードを検証するとき、彼らはパスワードを保存されたハッシュと比較し、それがデータベースのハッシュと一致する場合、それは有効なパスワードと見なされます。次に、ユーザーにログインを許可します。
ハッシュをソルトすることでこの攻撃を無効にすることができますが、衝突を防ぐことはできません。ハッキングされたハッシュを、衝突を生成したハッシュリストと比較し、そのパスワードをWebサイトに入力することができます間違ったパスワードを使用している場合でも、ハッシュが検証される限り、pwnされます。
以下は、フィッシング詐欺師や他の悪意のある個人がハッシュ化されていない無塩の平文パスワードを使用して何ができるかを示すほんの一部の例です。必ずしも直接ターゲティングするために使用されるとは限りませんが、Hacker
がPerson A
をターゲティングしたいとします。 Person A
をターゲットに設定する方法を推測してみましょう。
Hacker
です。あなたの仕事は、ウェブサイトをハッキングし、この情報を集約するデータベースを開発することです。Person A
は関心のある人物です。 Person A
は、ハッキングされたサイトデータベースの1つに表示されます。これで、ユーザーのメールアドレスと、そのWebサイトで使用しているpassword
がわかりました。password
を使用してemail address
にログインすることができます。甘い、それはうまくいく!IMAP
またはウェブメールからすべてのメールをダウンロードします。この時点で、多くの興味深いことがわかります。彼らはPerson B
と通信しています。pretend to be like them
、または追加情報を見つけることができます。情報/アクティビティには次のものが含まれます。Person A
はオンラインでMark Buffalo
として投稿します。それは比較的ユニークな名前です。次に、Mark Buffaloをググって、彼が投稿しているWebサイトを探します。たぶん彼は他のサイトで彼の性格をもっと明らかにしていますか?Mark Buffalo
はそのウェブサイトで同じパスワードを持っています。たぶん、あなたはそのウェブサイトにログインして、他の人との彼のプライベートなコミュニケーションを見ることができますか?Mark Buffalo
のアイデンティティを知っているので、彼が特定のWebサイトでpersonal information
を共有したらどうなるでしょうか。男性または女性のエスコートを検索するクレイグリストに投稿し、電話番号をそこに残した場合はどうなりますか?あなたはすでに彼の電話情報を見つけたので、彼をセットアップしてお金/情報/電力を脅迫する方法を見つけることができます。電話番号を含めない限り、これはパスワードのソルトとはあまり関係ありませんが、リークのおかげで別のWebサイトで電話番号を見つけます。これは、情報を収集してユーザーに対して使用できる非常に強力な方法の1つです。結局のところ、これはInformation Security
フォーラムなので、この例を使用したいと思います。Facebook
アカウントを持っています(私は持っていません)。同じパスワードでこれにアクセスできますか?バッファローが同じパスワード/メールの組み合わせを使用している場合は、おそらく。そして、おそらくあなたが以前にアクセスした彼のメールからこれを推測することができます。これでログインして、彼のFacebookメッセージを読むことができます。今、私たちは彼の家族が誰であるかを知っています。その後、脅迫攻撃をより簡単に調整できます。Person B
にメールを送信し、彼を知っているふりをします。十分な数のメールを読んだので、Mark Buffalo
を真似して、まるで彼のように見えるようにすることができます。 Person B
が実際に何が起きているかを気にせずにメールを作成し、Person B
以下に同じことをすることができます。そして、それはアイデアのほんの一部にすぎません。他人の資格情報にはさまざまな用途があります。パスワードをソルトおよびハッシュし、bcryptやscryptなどの衝突耐性のあるハッシュアルゴリズムを使用し、preventSQLインジェクション攻撃を防ぎます。私を付き添いを求める非難に変えないでください!マークバッファローを救え!
(別のIPを使用すると、一部のWebサイトがサービスにアクセスしようとする試みをブロックできることを承知していますが、これには多くの方法があり、すべてのWebサイトがこれを行うわけではありません)。
ところで、ハッキングされた場合の集団訴訟の可能性についておめでとうございます。
一般的なタイプの違反は、ユーザーテーブルへの読み取り専用アクセスです。これは、このテーブルが、認証を受ける必要のないログインを行うコードで使用されているためです。パスワードを取得すると、すべてのデータへの読み取りアクセスが許可されます。ただし、攻撃者がすでにDBに対する完全な読み取りアクセス権を持っている場合でも、パスワードを使用して書き込みアクセス権を取得し、アカウントにログインして一部のデータを簡単に変更することができます。
ユーザーのパスワードをソルトおよびハッシュする非常に単純な理由の1つは次のとおりです。
ユーザーのパスワードはhis/hersecret
他の誰もそれを知らないはずです。あなたでも、同僚でも、DBAでもありません。 なし。そのような単純な...
ソルティングの一部は、パスワードの分析と盗み取り、他のサイトでのユーザー名/電子メールとパスワードの組み合わせの使用をより困難にすることです。
ユーザーが複数のサイトで1つまたは2つのパスワードを再利用することはかなり一般的です。アルゴリズムを変更してソルトを実行し、少し時間がかかるようにする(bcrypt、scryptなど)ことを強くお勧めします。ほとんどの言語で実装するのはかなり簡単です。
データベースにアクセスできる場合、データベースから直接データを盗むことができるため、実際にはパスワードは必要ありません。
パスワードisは貴重なものです。これは、多くの人が同じパスワードを再利用するためです。したがって、鳩クラブのパスワードは、オンラインバンキングで使用するものと同じにすることができます。
私は、「低品位」の情報を多く保持しているシステムを管理しています。
これらも貴重です。 「eBay」または「Apple」から最近受け取った、詳細が「確認」されない限りアカウントが制限されているとのクレームがありました。彼らは私の本名を言わないので、彼らは通常明らかに偽物です。しかし、名前と電子メールアドレスを保存すると、より多くの個人情報を要求して、現実的な外観のメール送信を行うのがはるかに簡単になります。例えば:
ゴッサムシティの42ステーションストリートのスミスさん、こんにちは。
今年度、クラブがあなたに過大な請求をしたことに気づき、$ 10を払い戻したいと思います。銀行口座の詳細を記載して返信してください。口座に入金されます。
そのため、メールや名前は無視しないでください。
ただし、一番下の行は、既存のデータベースのハッシュ化とソルト化は、コーディングとテストにおよそ1時間しかかからないということです。次に、平文のパスワードをハッシュ化およびソルト化されたパスワードに「バッチ変換」できます。
ソルトの目的は2つあります。1つ目は、各パスワードにunique(-ish)要素を導入するため、2人のユーザーが偶然同じパスワードを使用した場合、パスワードのハッシュ化されたテキストが変化します。ユーザーAが自分のパスワードハッシュが「QWERTYU123」であり、ユーザーBのパスワードハッシュも「QUERTYU123」であることがわかった場合、ユーザーAはユーザーBと同じパスワードを持っていると推測できます。
次に、データベースへのアクセス権を持ち、辞書攻撃でパスワードをブルートフォースで攻撃したい人に、大幅なスピードバンプをもたらします。ソルトがなければ、攻撃者は単に「TRUSTNO1」をハッシュして「QUERTYU123」というハッシュを取得し、パスワード列をスキャンしてそのテキストが表示されるかどうかを確認できます。ソルトを使用すると、攻撃者は一致をテストするためにデータベースのすべての行の「TRUSTNO1」をハッシュし直す必要があり、各辞書エントリのチェックに必要なCPUの量が大幅に増加します。
攻撃者がデータベースにアクセスできた場合の意味もわかります。ただし、適切に設計されたセキュリティシステムでは、ユーザーとサーバーの両方が個別に暗号化した情報のみがデータベースに格納されます。
一般に、パスワードは非表示の値の最初のレーンであり、データベースの暗号化キーが侵害された場合にセキュリティの第2層を提供するために、データを復号化するためにハッシュできるユーザーに与えることができます。これにより、違反があった場合でも、ユーザーのデータは安全です。
このコンテキストでは、ハッシュのポイントは、一方向、つまりトラップドア関数の考え方に基づいています。この関数は、計算は簡単ですが、逆にするのが難しい関数です。ユーザーがパスワードを生成すると、システムはそのハッシュを計算し、その値をデータベースに格納します。ユーザーがシステムにエントリを取得するためにパスワードを送信すると、そのハッシュが計算され、データベース内の値と比較されます。それらが同じであれば、すばらしいです。そうでない場合は、パスワードが間違っていたため、ユーザーはシステムにアクセスできません。これを機能させるには、ハッシュに2つのプロパティが必要です。(1)異なる元の値は異なる値にハッシュされます。 (2)ハッシュから元の値に移動することは計算上困難です。
では、なぜハッシュを気にする必要があるのでしょうか。誰かがデータベースをハッキングした場合(コンピューターのハッキングだけでなく、ソーシャルエンジニアリングの攻撃、バスへのプリントアウトの残し、不満を抱いた従業員の行動など)、彼らが得るのは一連のハッシュ値だけです。ハッシュ値から元の値を復元することは難しいため、これはハッカーにとってあまり役に立ちません。プレーンテキストのパスワードがデータベースに保存されている場合、データベースが侵害されればハッカーが勝ちます。彼はすべてのアカウントとパスワードに直接アクセスでき、基本的に自分がやりたいことは何でもできます。この設定は、あなたが他人のパスワードにアクセスできないことも意味します。これは良いことです。たとえあなたが自分を信頼していても、あなたはおそらく信用しておらず、信用する必要もありません---銀行のカウンターパート、仕事の前任者または後継者など。あなたは、大規模に依存する必要はありません。またはあなたの情報が安全であることを保証するために管理者の気まぐれ。
塩に関しては、ハッシュが効果的であるためには2つの重要な特性を持たなければならないことを前述しました。 (ここではスキップしている関数がいくつかあります。)これらのプロパティを持つ関数を見つけるのは簡単ではなく、サイトの特定の管理者が適切な関数を思いつくことは賢明ではありません。代わりに、ほとんどの人が使用する広く利用可能なハッシュがあります。ソルトのポイントは、異なるサイトが異なるハッシュを効果的に使用することを保証することです。「パスワード」をハッシュする代わりに、「ソルト」のさまざまな値に対して「ソルト」+「パスワード」を代わりに使用します。つまり、2つのサイトで同じパスワードを使用する場合、実際には2つのシステムでハッシュが異なるため、ハッカーは一方を使用して他方を破ることはできません。また、ソルトがなければ、ハッカーは妥当な長さのパスワードのすべてのハッシュをブルートフォースで攻撃できます。ハッシュは元に戻すのが難しい必要があると上記で述べました。たとえば、10文字まで(または最も一般的に使用されるパスワード)までのパスワードのすべての可能なハッシュのテーブルがある場合、ハッシュを逆にするのは簡単です。テーブルで調べてください。
他の回答に加えて、データベースへの完全に安全なアクセスと完全なアクセスの間には、さまざまな程度の脆弱性があることに注意してください。脆弱性は、一部のパスワードのみ、またはパスワードの最初の数文字のみを公開したり、特定のユーザーと関連付けることが困難になったりする可能性があります。ハッシュとソルティングは、軽度の違反が主要な違反になるのを防ぐことができます。
また、侵入者は自分自身の露出を制限することを好みます。システムに侵入するために脆弱性またはバックドアを使用する時間が長いほど、目的を達成する前に発見されてロックアウトされる可能性が高くなります。パスワードをハッシュ化せずに無塩のままにしておくと、ユーザーになりすましてシステムに戻るための非常に簡単な方法が与えられただけであり、検出と緩和は非常に困難です。
名前、電子メールなどのユーザー情報を暗号化し、生の形式で保存するのではなくデータベースに保存すると、アプリケーションのセキュリティがさらに強化されます。次に、データベースにアクセスできる人も、データを簡単に読み取ることができません。あなたが保存する、どんな顧客からのどんな種類の情報も、それは秘密です。それは彼らのデータであり、ハッキングが低グレードの情報や極秘情報であることを意味することを困難にするような方法でそれを格納することは開発者の責任であるためです。また、一般的にサーバーはファイアウォールの内側に置かれているため、データの復号化と暗号化はサーバー側で行う必要があります。したがって、セキュリティの観点からはより安全になります。