web-dev-qa-db-ja.com

パスワードを使用してユーザーデータを暗号化し、パスワードを忘れた

私はたくさんの個人的なもの(情報、写真...)を保存するWebアプリケーションを作成することを計画しています。また、ユーザーに保護感を与えるために、データベースに保存する前にデータを暗号化したいと考えています。

そのため、データベースには(検証するための)パスワードのハッシュとユーザーデータ(キーとしてパスワードで暗号化された-またはパスワードから派生したキー-)を格納します。

Forget-my-passwordオプションを提供するにはどうすればよいですか?唯一の方法は、キーをどこかに保存することです。これにより、最初にデータを暗号化する利点がなくなります。

17
Yousf

これを行う標準的な方法は次のとおりです。

  1. PBKDF2やbcryptなどのソルトキー派生アルゴリズムを使用して認証ハッシュを作成します。
  2. データ暗号化用のランダムな代理キーを生成します。このキーですべてのデータを暗号化します。
  3. 別のソルトを使用してパスワードから「ロック」キーを生成しますが、強力なKDFを使用します。
  4. 代理キーとロックキーをXorして、その値を保存します。これにより、パスワードが不明でない限り、マスターキーが不明になります。
  5. ログイン時に、ロックキーを生成し、保存された代理キーを使用してXORを実行します。これにより、実際の代理キーが得られます。

このシステムの利点は、パスワードを簡単に変更できることです。古いパスワードを使用して代理キーを復号化し、新しいパスワードから新しいロックキーを生成するだけです。

このようなメカニズムを使用する場合、データを復号化するonlyの方法は、別のシークレットを使用して代理キーの2番目の暗号化されたコピーを作成しない限り、パスワードを持つことです。

ここに私がそれをする方法があります:

  1. 3つの秘密の答えを提供するようにユーザーに依頼します。回答を大文字に変換して連結します。その値をKDFで実行して、2次ロックキーを作成します。
  2. 代理ロックキーと二次ロックキーをXorし、それをバックアップキーとして保存します。
  3. ユーザーがパスワードを忘れた場合は、秘密の回答を求めて二次ロックキーを生成し、それを使用して代理キーを計算します。

秘密の答えのオプションが最も簡単ですが、任意の秘密の値でこれを行うことが可能です。

17
Polynomial

「パスワードを忘れた」問題を解決するには2つの方法があります。

  1. oneパスワードではなく、twoパスワードでデータを暗号化します。これを効率的に行うには、中間キーを使用します。データファイルはランダムファイルキーで暗号化されます[〜#〜] k [〜#〜]、キー[〜#〜] k [〜#〜]は2回暗号化されます。1回目は最初のパスワード、もう1回は2番目のパスワードです。とにかく、すべてのデータを再暗号化せずにパスワードの変更をサポートするために、実際には中間キーが必要です。

    そのシナリオでは、2番目のパスワードは、ユーザーが忘れない「バックアップパスワード」になります。この種の奇跡(ユーザーが定期的に使用するパスワードを忘れてしまったため、ユーザーが決して使用しないパスワードを忘れないようにする方法)は、いくつかの方法で実現できます。バックアップパスワードは、ユーザーが書いた長い文字列である可能性があります金庫(または彼の財布)に保管されている紙の上にバックアップパスワードは、「@ Polynomialが示唆するように」「セキュリティの質問」に対する回答で構成されている可能性があります。..

  2. key escrow を使用します。ユーザーのパスワードまたは中間キー[〜#〜] k [〜#〜]のコピーは、「信頼できるサードパーティー」、緊急時にロック解除されます。 TTPは適切に保護され、データの所有者(パスワードを忘れたユーザー)が物理的な手段(たとえば、示す人と彼の運転免許証)。 非対称暗号化 が使用されている場合、エスクローステップはTTPと対話せずに実行できます。TTPにはRSAキーペアがあり、ユーザーのパスワードは公開キーで暗号化され、TTPは秘密キーを使用して紛失したパスワードのロックを解除します。

    キーエスクローが適用可能かどうかは、実際にはコンテキストに依存し、最終的には、ユーザーに貴重なデータのロック解除に支払う金額をどれだけ支払うかによって異なります。別の状況では、Microsoftの BitLocker ドライブ暗号化テクノロジ(Windowsの最近のバージョンまたは高価なバージョンに含まれています)はキーエスクローをサポートしているため、sysadminはパスワードを忘れたユーザーのデータを保存できます。

    キーエスクローとは、サーバーが(TTPの助けを借りて)理論的には、ユーザーの同意や知識がなくてもユーザーデータのロックを解除できることを意味します。これは、ユーザーデータが実際に自分のものではなく、ユーザーが利用できないことを意味します(たとえば、企業では、ユーザーがバスに襲われた場合、後継者は保存されたビジネスデータを読み取ることができなければならず、以前のテナントはできません)より長い彼のパスワードを与える)。逆に、大々的に宣伝されている Mega サイトでは、あらゆる種類のエスクローとパスワードの喪失を故意に忘れており、ユーザーの協力なしにデータにアクセスする方法がないことを非常に合法的に確認しています。 。

11
Thomas Pornin

少し説明的ではありませんが、より概念的な方法で、基本的には、同じキーに到達するために2つの異なる手段を提供する必要があります。これは、セキュリティニーズに応じて、通常はレコードまたはユーザーのすべてのレコードに固有のデータキーを持つという考え方です。次に、パスワードから導出された鍵と他の情報から導出された鍵を使用して、その鍵を暗号化します。それは彼らが知っている別のことかもしれませんし、あなたのサーバーが知っているものかもしれません。これは、対称暗号化にすることも、セキュリティを強化するために、サーバーが保持していない秘密キーに公開キーを使用できることをサーバーが知っている情報にすることもできます。

次に、ユーザーがパスワードを紛失してデータキーにアクセスできなくなった場合、その代替暗号化を解読してキーを取得できます。セキュリティの観点から、サーバーにキーを対称的に格納することは、サーバーとDBの両方が危険にさらされているかのように安全性が最も低く、暗号化は役に立たなくなります。ユーザー情報は少し優れているかもしれませんが、簡単に覚えられるようにするために、簡単に調査または推測できるため、サーバーが侵害されていなくても安全ではありません。サーバーがリセットに必要な情報にアクセスできない非対称オプション(データキーの復旧バージョンを暗号化する方法を知っているだけなので、最も安全ですが、使いやすさの観点からも最も困難です)次に、復号化は、a)手作業で行うか、b)セカンダリの高度にセキュリティ保護されたサーバーで行う必要があります。

どちらにしても、基本的な原則は同じです。シークレットがないと、キーは常に回復不能になります。異なるシークレットを使用して、キーを複数回保存するだけです。

1
AJ Henderson