HTTP経由の通信を考えると
基本的なアクセス認証に続いて Saltedチャレンジレスポンス認証メカニズム (SCRAM)を使用し、その後すべてのリクエストにトークンを使用することで、セキュリティはどのように向上しますか?
tl; dr:一般的にはお勧めしませんが、特定の状況では役立つ場合があります
HMAC(PBKDF2(password), "Client Key") XOR HMAC(H(HMAC(PBKDF2(password), "Client Key")), AuthMessage)
(真剣に、私はこれを作りません!)HMAC(HMAC(PBKDF2(password), "Server Key"), AuthMessage)
最初のポイントは残念ですが、2番目のポイントは本当のキラーです。今やスマートフォンやタブレットはどこにでもあるので、クライアントが安全になるのに十分な反復でPBKDF2をすばやく計算できると思い込むことはできません。
SCRAMの用途としては、クライアントは信頼されていますが、サーバーは信頼されていません。これはWebアプリケーションには当てはまりません(「クライアント」はサーバーから送信されたJavaScriptであるため)。ローカルアプリケーションに当てはまる場合もあります。私が考えることができる最良の例は Wikipediaが提供するもの :SMTP、IMAP、およびXMPPです。ここでは、メールまたはチャットクライアントを信頼しているが、潜在的に悪意のあるサードパーティのサーバーに対して認証を行っています。
クライアントが高い反復回数と一意のソルトを強制する場合、不正なCAと組み合わされたDNSハイジャックのリスクを軽減する可能性がありますが、すでに証明書のピン留めでそれを行っています。防御するために残された唯一のものは、悪意のあるyourサーバーです。これは、場合によっては役立ちますが、SCRAMの欠点を上回る場合にのみ役立ちます。
SCRAM could強力なパスワードが使用されることがわかっている場合にサーバーがパスワードを取得しないようにするのに役立ちますが、パスワードは他の場所でも再使用されます(再利用されない場合、なぜあなたはサーバーはそれを知っているかもしれませんか?)残念ながら、これは実際に強制することはできず、idealはとにかく一意のパスワードを使用することになります。
SCRAMでは、サーバーは以下を保管します。
ServerKey = HMAC(PBKDF2(password), "Server Key")
(_"Server Key"
_は既知の定数HMACキーです)*StoredKey = H(HMAC(PBKDF2(password), "Client Key"))
(_"Client Key"
_の同上)認証するには:
ClientKey = HMAC(PBKDF2(password), "Client Key")
StoredKey = H(ClientKey)
ClientSignature = HMAC(StoredKey, AuthMessage)
(ここでAuthMessage
は、以前に交換されたすべてのメッセージとナンスの連結で、コンマで区切られています)ClientProof = ClientKey XOR ClientSignature
_ClientProof
をサーバーに送信しますClientSignature = HMAC(StoredKey, AuthMessage)
ClientKey = ClientProof XOR ClientSignature
_ServerSignature = HMAC(ServerKey, AuthMessage)
H(ClientKey) == StoredKey
を検証し、クライアントがパスワード(または少なくともClientKey
)を知っていることを証明しますServerSignature
で応答しますServerSignature
を計算し、それをサーバーから返された値と比較して、サーバーがServerKey
を知っていることを確認しますハッシュの選択、エンコーディング、メッセージフォーマット、チャネルバインディングなどが除外されているため、これはかなり単純化されていますが、それがどのように機能するかについては良い考えが得られるはずです。
* PBKDF2のすべての使用には明らかにソルトと反復カウントも含まれ、SCRAMはdkLen
を選択したハッシュの出力長に設定します
[〜#〜] rfc [〜#〜] は、次の利点を示しています。
o認証データベースに格納されている認証情報だけでは、クライアントを偽装するには不十分です。データベースが盗まれた場合に、事前に格納された辞書攻撃を防ぐために、情報はソルト化されます。
oサーバーは、クライアントを他のサーバーに偽装する機能を取得しません(サーバー承認プロキシを除く)。
oこのメカニズムでは、バックエンドサーバーとのスーパーユーザー権限を持つプロキシーを必要とせずに、サーバー承認プロキシーを使用できます。
o相互認証はサポートされていますが、名前が付けられるのはクライアントのみです(つまり、サーバーには名前がありません)。
質問では接続のセキュリティのみが考慮されますが、SCRAMではクライアントの資格情報のセキュリティも考慮されます。その最も明確な利点は、ソルトおよびハッシュ形式で送信されるため、サーバーオペレーターがユーザーの資格情報を取得できない一方で、単純なTLS接続ではクリアテキストで移動することです。