web-dev-qa-db-ja.com

データを送信するクライアントアプリケーションを安全に認証するにはどうすればよいですか?

クライアントアプリケーションからhttps経由で送信されたウェブサービスのロギング/記録のユーザーデータがあります。アプリを偽装した偽のツールではなく、クライアントアプリケーションによってデータが確実に送信されるようにする方法はありますか?理想的には、クライアントで難読化されたキーを非表示にするなどの手段に頼る必要はありません。

12

できません。サーバーは基本的にクライアントを信頼できません(いくつかの例外があります-クライアントマシンが強化されている場合(ハードウェアがファームウェアを検証し、ファームウェアがOSを検証し、OSが実行中のすべてのアプリケーションを検証します)、それを実行できる可能性があります(ただし、実際には-誰かではありません)はんだごてを使用すると、ハードウェアの検証が常に変更される可能性があります)が、クライアントを100%制御できない場合は、ちょっと運が悪いです。

あなたは自問する必要があります:クライアントが偽のデータをアップロードするリスクは何ですか? yourアプリケーションがデータをアップロードしていることを認証しないとどうなりますか?あなたが尋ねるべき1つの難しい質問:クライアントは偽のデータをアップロードするインセンティブを持っていますか?ユーザーが偽のデータをアップロードするインセンティブがない場合は、おそらく気になりません。

あなたができることの1つcanする:アプリケーションを実行しているユーザーを認証し(多数の認証メカニズムのいずれかを使用)、認証されたユーザーID(およびIPアドレス)と共にアップロードされたデータを保存します。 。そうすれば、ユーザーがdoes偽のデータをアップロードした場合、誰が変更を行ったかを追跡できます。もちろん、あなたは今あなたのサービスのプライバシー問題を抱えているかもしれないデータPIIを作りました。

クライアントを認証する必要がありますが、そのためには何らかの秘密が必要です。人間のユーザーがクライアントを制御している場合は、ユーザーが知っている、またはアクセスできるシークレットを使用して、ユーザーを登録および認証することができます。

クライアントが自動化されていて、クライアントが依存しているハードウェアおよびソフトウェア環境を制御していない場合、クライアントを制御できる攻撃者に直面しても運が悪かったことになります。しかし、あなたはそれを難し​​くすることができます。

あなたの問題は、クライアントアプリケーションのライセンスの一般的な問題に関連しているようです。これに対する1つのアプローチの良い概要(Androidアプリ、Javaの場合)は次のとおりです:

http://Android-developers.blogspot.com/2010/09/securing-Android-lvl-applications.html

あなたはそれをあなたの環境に適応させるか、あなたの状況に適した他のオープンソースライブラリを探すことができます。

ちなみに、「秘密保持によるセキュリティ」は問題ありません。秘密鍵のような秘密は、最も優れたスキームの一部です。人々が避けようとするのは「セキュリティによるあいまいさ」です。つまり、物事を複雑にしたり、攻撃者があなたのアルゴリズムを理解しないふりをしたりします。

8
nealmcb

10の不変のセキュリティ法則 を見てみると、法則3は問題を基本的なレベルで説明しています。

法則3:悪意のあるユーザーがコンピュータに物理的に無制限にアクセスできる場合、それはもはやコンピュータではありません。

2
Steve

Kerberosを使用して、クライアントとサーバー間の相互認証を実行できます。たとえば、最初にクライアントを識別するために、帯域外の方法を使用することをお勧めします。識別子を使用してユーザーを発行します。もちろん、あなたは今、その識別子が危険にさらされていないことに依存しています...

1
user185

他の人が言ったように、あなたが作成した証明書でクライアントが認証されるまで、クライアントを信頼することはできません。この時点で、問題全体が鍵/証明書の配布の問題に要約されます。

  1. クライアントは、実際のサーバーから適切な証明書を取得していることをどのようにして知るのでしょうか。
  2. サーバーは、悪意のあるクライアントに適切な証明書を提供していないことをどのようにして知るのでしょうか。

これらの質問に(正しく!)回答するまで、認証に続く他のすべてのイベントは無効です。

0
Marcin