クライアント側でパスワードをハッシュすることについて多くの質問があることは知っていますが、私が見つけたそれらのどれも私のユースケースに対応していません。
私のアプリはエンドツーエンドで暗号化され、実際のユーザーパスワードをサーバーに送信するオプションはありません。クライアント側でパスワードをハッシュする必要があります。
何時間もの調査の結果、SHA256でPBKDF2を使用することにしましたが、混乱しています。 PBKDF2には塩が必要なようです。
PBKDF2の他の実装が見つからなかったため、crypto-jsの実装を使用したいと思います。
PBKDF2のソルトはどのように生成すればよいですか?結果のハッシュは、アプリケーションサーバーの観点からはユーザーのパスワードになるため、実行ごとに同じである必要があります。
これが行われている参照コードまたはプロジェクトを追加で提供できますか?
(ハッシュはMITMを防ぐことを目的としたものではなく、アプリケーションがパスワードを知ることを防ぐことを目的としています。)
前もって感謝します。
コンテキスト(@ Daisetsuが提案)
これは、ネットワークスイッチなど、小規模なチームが資格情報を保存できるアプリケーションである必要があります。企業がアプリケーションを信頼でき、アプリケーションサーバーをハッキングしても機密情報が提供されないように、すべてのデータはエンドツーエンドで暗号化する必要があります。
一部のユーザーは秘密鍵の認証と暗号化に同じパスワードを設定する可能性があるため(すべてのユーザーが行うと思います)、サーバーは通常、ユーザーがログインするときに秘密鍵を復号化できます。これを防ぐには、次のようにする必要があります。クライアントによってハッシュされます。
Javascriptは信頼できませんが、すべてのファイルを含むZipを作成し、angularアプリをローカルでREST API;)に対して実行できます。
コメントで述べたように、サーバーが提供するjavascriptは信頼できません。クライアント側をコンピューターにダウンロードしたままにしておくというアイデアは興味深いものですが、それでも問題は実際には解決されません。あなたがめちゃくちゃ注意しない限り、サーバーはまだ応答の一部としてjavascriptを含めることができます。この場合、私は実際にはjavascriptを使用しません。それがうまくいかない可能性がある方法は多すぎます。
この場合の私の推奨事項は、機密性の高い資格情報を扱っているため、ブラウザープラグイン、またはコンパイルして署名できるその他のクライアント側アプリケーションを使用することです。 lastpassのようなサービスだけで行けなかった理由はありますか?なぜ車輪の再発明をするのか。
編集:
Saltを使用してcrypto-jsPBKDF2を実装する方法 https://stackoverflow.com/questions/22875419/cryptojs-how-to-generate-aes-passphrase
また、ユーザーはシステムログインと秘密鍵の両方でパスワードを再利用すると思います。ユーザーがキー/証明書をシステムに送信した後、ユーザーが提供したパスワードを使用して、アップロードされた資格情報の監査を調べて、証明書/秘密キーのロックを解除することをお勧めします。