REST API を設計していますが、ユーザー認証のセキュリティに関して問題があります。認証のために、パスワードをネットワーク経由でプレーンテキストで送信したくありません。
この問題を回避するために、パスワードの SHA-256 ハッシュ (ユーザー名をソルトとして) を送信できるので、パスワードがプレーン テキストで送信されることはありません。私のデータベースでは、次のハッシュを保存します: SHA256(パスワード + ソルト) 両方のハッシュが一致するかどうかを比較します。
このオプションの問題は、高速ハッシュ アルゴリズムで計算されたハッシュがあり、ソルトがランダムではないことです。
セキュリティのベスト プラクティスは、ランダムなソルト (bcrypt など) を使用した低速の署名アルゴリズムを使用することです。
遅いアルゴリズムは問題ではありません。クライアント側で bcrypt を使用できますが、salt の場合はどうすればよいかわかりません。
- Bcryptには定義されたサイズのソルトが必要なので、ユーザー名を入れることができません
- ランダムなソルトを使用している場合、クライアントはパスワードのハッシュを計算する前にこのソルトの値をどのように知るのでしょうか?
だから私は3つのオプションを見ることができますが、満足できるものはありません:
- パスワードをプレーンテキストで送信し(SSLを使用しています)、bcryptをdbに保存します=>まだ中間者に対して脆弱です
- 私はSHA256を使用し、ソルトがユーザー名であるハッシュを送信します(まだSSLを使用しています)=>データベースのハッシュは安全性が低くなります
- 私はbcryptを使用しており、2段階のプロセスがあります。特定のユーザーのソルトを要求し、このユーザーのハッシュを送信します(まだsslを使用しています)=>他のユーザー名でログインしようとすることで、彼のソルトを取得できます。驚くばかり
誰かがより良い解決策やアドバイスを持っていますか?