Java で安全なファイル共有アプリケーションを作成しています。一般的なアーキテクチャは次のようになります。
- ユーザーは、複数のユーザー間で安全に共有するためにファイルを暗号化したいと考えています。
- アプリケーションはクライアントでランダムな UUID を生成し、これを AES 256 パスワードとして使用し、UUID でデータを暗号化します。
- UUID は、各人の公開鍵で RSA 暗号化されます。共有ユーザーごとに 1 回。
- 暗号化された各 UUID パケットは、ファイルの一部としてカスタム ファイル ヘッダーに格納されます。
- ファイルは、他のユーザーがアクセスできるサーバーにアップロードされます。
- ユーザーはそれぞれ自分の秘密鍵を使用して AES 暗号化鍵を読み取り、ファイルを復号化できます。
これがキャッチです。複数の場所からファイルにアクセスできるように、ユーザーの秘密鍵は暗号化してサーバーのデータベースに保存する必要があります。秘密鍵は、サーバーにアップロードされる前に、クライアントでユーザーが選択したパスワードで暗号化されます。
AES 256 ビット暗号化を使用してこれを行いたいと思います。そして、BouncyCastle ライブラリやサード パーティのライブラリに依存せずにすべてを実行したいと考えています。標準の Java 5 ライブラリを使用する必要があるため、PGP などではなく、AES 256 暗号化と RSA を使用することにしました。
このアプローチで本質的に安全でないものを誰かが見つけたり、これを行うためのより効率的な方法を考えたりできますか?
編集:
OK、私が得たすべての回答は、秘密鍵をサーバーに送信しないことを示唆しているため、質問を更新しています。サーバーに秘密鍵が必要な理由は、ユーザーが複数のクライアントと複数の場所 (つまり、iPhone、iPad、職場のラップトップ、自宅の PC) からデータにアクセスできる必要があるためです。デバイスからデバイスへとキーを管理およびコピーする必要はありません。これは、キーをサーバーに保存するよりもさらに安全ではありません。