web-dev-qa-db-ja.com

保存時のファイル暗号化、パスワードに関する考慮事項

one passwordで暗号化して保存したいファイルが最大10,000個あります。

現在のアイデアは次のとおりです。

  1. Scryptの(高価な)パラメーターを含むマスターファイルを1つ用意します。
  2. 暗号化/復号化の場合、指定されたパラメーターを使用してユーザーパスワードをハッシュし、対称暗号暗号化/復号化のキーとして使用します
  3. 各ファイルには、一意の暗号化された安全なランダムナンスがプレフィックスとして付けられます(1回のみ使用)

私の質問:

これは一般的に間違っていますか?

単一のパスワード/派生キーで十分ですか、または

  1. ファイルごとに新しいキーを取得する必要がありますか(時間がかかるのではないかと心配しています)?
  2. 大量のファイル(たとえば、100ごと)の新しいキーを取得する必要がありますか?
1

これは一般的に間違っていますか?

実装に2つの問題があります。

  1. IVの代わりにランダムプレフィックスを使用

    これは技術的には実行できますが、推奨または推奨されていません。詳細については、 this を参照してください。ファイルごとにランダムなIVを生成し、暗号文と一緒に(プレフィックスまたはサフィックスとして)保存します。

  2. 派生キーを暗号化キーとして直接使用します。

    パスワードが変更された場合は、すべてのファイルを再度復号化して暗号化する必要があります。これを解決するには、すべてのファイルの暗号化に使用される単一のランダム暗号化キーを生成する必要があります。次に、このキーをユーザーパスワードから派生したマスターキーで暗号化し、別のファイルに保存します。パスワードが変更された場合(したがってマスターキー)、暗号化キーを含むファイルのみを復号化および暗号化します。同様のスキーマを使用するよく知られた実装の例については、 [〜#〜] dpapi [〜#〜] とそれがキーを処理する方法を見てください。

単一のパスワード/派生キーで十分ですか、または

  1. ファイルごとに新しいキーを取得する必要がありますか(時間がかかるのではないかと心配しています)?
  2. 大量のファイル(たとえば、100ごと)の新しいキーを取得する必要がありますか?

これは、何に対して防御しているかによって異なります。上記の私のコメントを考慮すると、ユーザーパスワードから各暗号化キーを導出するのではなく、強力なCSPRNGからランダムに生成します。ファイルごとに新しいランダム暗号化キーがある場合は、暗号化キー暗号化されたマスターキーと暗号文およびIVを保存する必要があります。ファイル暗号化キーが侵害された場合、その1つのファイルのみが侵害されます。単一の暗号化キーマスターキー(ブルートフォース?)を損なうことなく侵害される可能性があるかどうかを考える必要があります。このシナリオが起こりそうにない場合、またはそれに対して防御しないことを選択した場合は、すべてのファイルに単一の暗号化キーを使用できます。

すべてのファイルに単一のキーを使用するときに考慮すべきもう1つのことは、キーを変更する必要がある前に、単一のキーで暗号化されたデータの大きさです。この質問への回答については、 this および this を参照してください。

1
Marko Vodopija