2017-10-12 2 views
2

NTLM Authenticationのように私はHow to Respond to an Authentication Challengeの3つのオプションがあると認識しています。URLSession |認証チャレンジレスポンス| NTLM

  • 認証資格情報を入力します。
  • 資格情報なしで続行してください。
  • 認証要求をキャンセルします。

しかし、単に資格情報の漏洩の可能性があり、我々は最初のオプションProvide authentication credentialsに行くときに我々は、ユーザー名とパスワードURLCredentialを渡し、ここで考えを知りたい、それは何が起こっているか、資格情報を渡すために確保されます画面の後ろに? AppleネットワークAPIがサーバーに資格情報を送信する方法

はい、サーバードメイン、失敗カウントなどのポリシーを設定できますが、セキュリティの観点からは安全ですか?ミドルアタックの男(MIMA)または他の何かから?

答えて

1

問題には複数の種類があり、質問に対する答えは、あなたが話している挑戦のタイプによって異なります。各チャレンジには保護スペースがあります。これは基本的にどのタイプのチャレンジに応答しているかを示します。

  • 基本的なパスワードベースの認証(NSURLAuthenticationMethodHTTPBasic):あなたが合格資格がサーバ(HTTP)にクリアテキストで送信されたか、セッション鍵で暗号化されている最も一般的な保護スペースのあなたの質問に答えるために

    (HTTPS)。

  • ダイジェスト認証(NSURLAuthenticationMethodHTTPDigest):渡した資格情報は、サーバーによって提供されたノンスで暗号化されハッシュされ、結果ハッシュトークンのみがネットワーク経由で送信されます。
  • NTLM認証(NSURLAuthenticationMethodNTLM):渡した資格情報は、サーバーによって送信されたナンスで暗号化されハッシュされ、結果ハッシュトークンのみがネットワーク経由で送信されます。
  • クライアント証明書認証(NSURLAuthenticationMethodClientCertificate):証明書はサーバーに送信されますが、秘密キーのデータは送信されません。クライアントは、クライアントが実際にその証明書に関連付けられた秘密鍵を持っていることをサーバーに確認させる手段として、秘密鍵を使用して以前のTLSハンドシェイクデータに署名します。
  • サーバー証明書検証NSURLAuthenticationMethodServerTrust):あなたは、サーバーから取得した証明書を渡すと、(つまり、サーバーがどのを送信することができ、あなたが最初にそれを検証しなければならないか、あるいはあなたが効果的にHTTPのようにセキュリティのレベルを下げますあなたはサーバーと話すときにその証明書を信頼すると言っているでしょう)。

上記のリストは、最も一般的な保護スペースです。ケルベロスはそれ自身の動物であり、どのように動作するか全くわかりません。また、フォームの保護スペースもあります。これは、アプリのコードのさまざまな部分で使用できるカスタム認証のプレースホルダですが、実際には意味のある方法ではサポートされていません。

Basic、Digest、およびNTLM認証は、攻撃者が通過中のデータを変更できる場合は、man-in-the-middle攻撃に対する保護を提供しません。何らかの方法でリクエストしてください。したがって、これらは実際には暗号化されたチャネル(HTTPS)での使用にのみ適しています。

+0

+1ありがとうございます。私は、チャレンジを受けるときにサーバーと共有している資格情報について考えています。それは安全かどうかです。多分、私が投稿した方法は明らかではない。 – Buntylm

+1

NTLMに関する情報をここに追加しました。私はDigest authの説明も修正しました。私はそれを思いついた暗号化スキームと混同していました。実際にはあなたの鍵を使ってメッセージ全体をハッシュするので、アカウントを作成する/パスワードを変更するときを除いて、MITMの影響をほとんど受けません。私の悪い。 :-)ダイジェスト認証は、基本的にNTLMと非常に似ています。 – dgatwood

2

多分私の質問を投稿した方法は明らかではありませんが、NTLM Authenticationとアプリケーションの資格情報のセキュリティの観点からもっと探していましたが、たくさんのGoogleの後に、NTLMの仕組みがわかりました。クライアントはサーバーとパスワードを共有しません。ここには以下の手順があります。

enter image description here

  1. クライアントがサーバに要求を行います。
  2. サーバはアイデンティティがないためユーザの検証が必要です。サーバはチャレンジと呼ばれる16バイトの乱数を生成し、それをクライアントに送信します。
  3. クライアントは、このチャレンジをユーザーのパスワードでハッシュし、レスポンスと呼ばれるサーバーに戻します。このサーバーには、プレーンテキストとしてのユーザー名とチャレンジがクライアントに送信されます。
  4. サーバーはドメインコントローラにすべてを送信し、ユーザー名を使用してセキュリティアカウントマネージャデータベースからユーザーのパスワードのハッシュを取得し、チャレンジをハッシュします。
  5. ドメインコントローラは、同一の場合は認証が成功し、それ以外の場合は失敗した場合、サーバーに応答を返します。

ここで興味深いのは、ネットワークAPIがサーバーとパスワードを共有しないということです。非常に安全です。

他人に役立つことを願って、For More

+0

基本的に、それは共有秘密のダイジェスト認証であり、サーバー提供のノンスだけです。上記のスキームの大きな弱点は、安全に送信できる証明書ではなく、共有された秘密(パスワード)を使用するため、暗号化されたチャンネル(TLSなど)を持たない限り、パスワードを更新する安全な方法がないことですサーバーはクリアです。 – dgatwood

+0

ああ、ダイジェスト認証よりも弱いのは、リクエスト全体ではなく認証のために16バイトのナンスだけがハッシュされるからです。つまり、送信中の送信データの変更に対して保護を提供しません。そのため、私は暗号化されていないトランスポートに対してこの認証方式を信頼しません。 – dgatwood

+0

@dgatwoodこれは本当にあなたから聞いてうれしいです、あなたは本当にコミュニティに役立つでしょうあなたの答えにリンクしてこれらのものを編集していただけますか?私はまた、ここでもっと学びたいと思っています。 – Buntylm