S3 スタイルの認証を使用する RESTful APIでは、API クライアントは HMAC-SHA1 を使用して秘密鍵でリクエストに署名するため、秘密鍵がネットワーク経由で送信されることはありません。次に、サーバーは、クライアントの秘密鍵を使用して署名プロセス自体を繰り返し、その結果をクライアントから送信された署名と比較することにより、クライアントを認証します。
これはすべて良いことですが、サーバーがクライアントの共有シークレットの平文にアクセスする必要があることを意味します。これは、ユーザーのパスワードをデータベース内に平文で保存することに対するあらゆるアドバイスに反するものです。パスワードのソルトハッシュのみを保存することは、私が知る限りオプションではありません。クライアントの署名を検証できないためです。
私の API は RESTful であるため、ステートレスであるべきであることを強調しておく必要があります。他の API 呼び出しの前にログイン手順を実行することは避けたいと考えています。
オプションのソリューションの 1 つは、対称キー アルゴリズムを使用してすべてのユーザー パスワードを暗号化することです。ただし、サーバーはその暗号化のキーを、ソース コード内など、簡単にアクセスできる場所に保存する必要があります。これは何もないよりはましですが、最適な解決策ではありません (@Rook が回答で述べたように、CWE-257 に違反しています)。
ソリューションの別の方向性は、非対称署名に関する何かかもしれませんが、それを HMAC に適用する方法がわかりません。また、この件に関する記事も見つかりません。
ここで明らかな何かが欠けていますか?多くの立派なプロバイダーがこの種の認証スキームを実装しています。それらすべてが共通のセキュリティ原則に違反しているわけではありませんよね? そうでない場合、共有できるベスト プラクティスはありますか?