web-dev-qa-db-ja.com

Webアプリケーションでの秘密鍵パスフレーズのセッション管理

ユースケース

Webアプリケーションのデータベース内のデータを暗号化したいと思います。次の要件があります。

  • 復号化は、ユーザーがパスフレーズを提供した場合にのみ可能でなければなりません
  • 暗号化は常に可能であるべきです

したがって、公開鍵と秘密鍵を使用して非対称暗号化を使用します。暗号化操作はいつでもWebアプリで開始できますが、Webアプリで復号化できるのは、ユーザーがパスフレーズを入力した場合のみです。

問題

これらはすべて正常に機能しますが、問題は、ユーザーがデータを復号化するたびにパスフレーズを提供する必要があることです。ユーザーがパスフレーズを1回入力した後、セッションに対して「認証されたままにする」オプションをユーザーに提供したいと思います。

ここで私は問題を抱えています。パスフレーズのハッシュをセッションに保存することにした場合、サーバーは技術的にユーザーの入力なしでデータを復号化できます。 Cookieでパスフレーズハッシュを覚えておくこともオプションではありません。

どのような一般的なオプションがありますか?私のアプローチ全体が正しくない可能性はありますか?

可能な解決策?

いくつか考えた後、私は以下を実装する予定です:

  • ユーザーがサーバーにパスフレーズを送信します
  • サーバーはランダムな128ビットキーを作成します
  • サーバーはパスフレーズをハッシュし、AESを使用して新しいランダムキーで暗号化します
  • 暗号化されたハッシュはサーバーのセッションに保存されます
  • ユーザーは自分のCookieに保存します:セッションIDと暗号化キー
  • 両方がリクエストで提供された場合のみ、サーバーはデータを復号化できます
  • セッションは一定期間後に無効になります

これは安全なアプローチですか?

データは次の場合にのみ復号化できます。

  • 暗号化されたデータが取得されます
  • 秘密鍵が取得されます
  • セッションデータが取得されます
  • ユーザーCookieが取得されます

メモ:

  • データ自体は公開鍵で暗号化されていませんが、ランダム鍵が生成され、AESを使用してデータを暗号化するために使用されます。次に、この鍵は公開鍵で暗号化されます。これにより、なんらかのユーザー管理が可能になります。

  • すべてがHTTPSで実行されます

  • 秘密鍵はパスフレーズ自体ではなく、パスフレーズのハッシュで暗号化されます

前もって感謝します

4
nanotvi

あなたが説明したことは OpenPGP 標準の基本に非常に似ています(ほとんど同じです)。このスキームの独自の実装を試みる前に、OpenPGPについて読むことをお勧めします。

ここで提示された質問に答えるには:

ここで私は問題を抱えています。パスフレーズのハッシュをセッションに保存することにした場合、サーバーは技術的にユーザーの入力なしでデータを復号化できます。 Cookieでパスフレーズハッシュを覚えておくこともオプションではありません。

これはトートロジーです。サーバーの暗号文イン/アウトパラダイムを維持しない限り、いつでも保存されたデータを復号化できます。最善の方法は、すべての操作でユーザー入力を要求することです。

1
Tim Lamballais