web-dev-qa-db-ja.com

シークレットの復号化が必要な「パスワードウォレット」に使用する正しい暗号は何ですか?

ユーザー名/パスワードの複数のインスタンスを暗号化して共通の場所に保存する共有の「パスワードウォレット」を作成したいと思います。

すべてのキーと値のペアが同じ暗号化キーを持つことは期待していません。実際、ほとんどのユーザー名とパスワードは別のキーを使用して暗号化することをお勧めします。

この場合に使用する理想的な暗号技術は何ですか?

4

これを行うには2つの簡単な方法があります。

  1. 最も簡単なのは、個人ごとに1つのウォレットを用意することです。アリスとボブの両方が特定のユーザー名とパスワードの組み合わせを表示できるようにする必要がある場合は、問題ありません。両方のウォレットに追加するだけです。各個人のウォレットは、個人がウォレットを開くために使用するパスフレーズを使用して暗号化されます。

    これは非常に単純なスキームです。一部のエントリの複数のコピーを保存する必要があることに異議を唱える前に、スペースが安いことを思い出してください。必要な追加のストレージは非常に簡単です。

  2. これは、もう少し賢く、少し単純ではない解決策です。ユーザー名とパスワードの組み合わせごとに、新しいランダム対称鍵Kを選択します。Kでユーザー名とパスワードを暗号化します。次に、このユーザー名とパスワードの読み取りを許可されているユーザーごとに、そのユーザーのパスフレーズでKの暗号化を追加します。 。

    たとえば、アリスとボブがユーザー名/パスワード「bloggerdude/fye7wi」の読み取りを許可されているとします。アリスが財布を開くために使用するパスフレーズがPAであり、ボブが財布を開くために使用するパスフレーズがPBであるとします。次に、次のエントリをウォレットに保存します。

    Encrypt(K、 "bloggerdude/fye7wi")、Encrypt(PA、K)、Encrypt(PB、K)。

    これは最初のスキームに比べて大きな利点はないと思いますが、完全を期すために言及したいと思いました。

最後に、ウォレットを設計する際に留意したい他のいくつかの考慮事項について説明します。

  • 何らかのメカニズムを使用して、ユーザーのパスワードに対する辞書攻撃を遅らせることをお勧めします。たとえば、PBKDFまたは bcryptパスワードハッシュ を使用できます。

  • ランダムソルトを使用してください。ユーザーパスワードだけの決定論的関数は絶対に保存しないでください。これは、時間とメモリのトレードオフに対して脆弱です(「レインボーテーブル」、人気のあるベナキュラーでは、それよりも広いですが)。

  • ユーザーが新しいサイトでアカウントを作成し、それに伴うパスワードが必要になったときに、ユーザーが新しい強力なパスワードを生成してウォレットに追加する簡単な方法を提供することを検討してください。

3
D.W.

[〜#〜] luks [〜#〜] に似たキースロットに基づく1つのアイデア:

各人は、パスフレーズキーと呼ばれるものに由来する独自のパスフレーズを持つことができます。次に、セクションを開こうとすると、パスフレーズキーがセクションキーに復号化できるスロットが見つかるまで、セクションキースロット(任意の数が存在する可能性があります)を繰り返し処理します。セクションキーは、そのセクションのパスワードを復号化します。

1