2011-12-28 10 views
7

私はアンドロイドアプリケーションで使用するために外部サーバーからデータを取得します。私はこのデータが私のアプリでのみアクセス可能であることを望みます。私は標準のhttp接続を使用して、json形式のapache/phpサーバーからデータを取得します。また、関連するデータを取得するためにいくつかのパラメータをサーバーに送信します。今、私は何をするつもりは次のとおりです。httpリクエストが私のアンドロイドアプリから来ているかどうか確認してください

  1. MD5( "someSecretPhrase" +のparams)のようなものを送るのparams
  2. を送信します。
  3. 秘密の句がサーバー側で正しいかどうか確認してください。

ここで、リバースエンジニアリングに関しては安全なアプローチですか?今のところ私はこのデータを得る他の可能性はないと考えることができます。しかし、もし誰かが私のAPKを逆コンパイルできれば、彼はこの "someSecretPhrase"(サーバ側でやるのは難しい)を取り出してサーバにアクセスすることができますか?本当の脅威ですか?サーバーによって私のアプリケーションを認証する他の可能性はありますか?

私はフォーラムなどを見ました。 Identify whether HTTP requests from Android App or not? and then respond appropriatelyですが、デコンパイルの問題については説明していません。

答えて

7

一方になりましたあなたはクライアントデータを信頼しません。これまで

あなたがなど攻撃者に知られているすべての「秘密」鍵は、

あなたは、しかし、あなたのリクエストを偽造する攻撃者の試みを妨げることができ、あなたのアプリが逆コンパイルを検討してください。リクエストのチェックサムの送信(および確認)は、方法の1つです(あなたの考えはMD5(secret_key + params))。

バイナリ暗号化プロトコルに切り替えることもできます。しかし、これにはさらに多くの作業とかなり異なるアーキテクチャのサーバーが必要です。

+0

私は共有ホスティングを開始しています。したがって、サーバー上の異なるアーキテクチャはおそらく私の選択肢ではありません。このデータは脆弱ではありません(クライアントのクレジットカード番号はありません)。しかし、集めるためには多くの作業が必要です(そして、それは継続的に集められます)ので、誰かが自分の考えをコピーしてデータを使うことができれば、 .. –

+1

あなたのサーバが何らかのデータで返信する場合は、それを公開しておくべきです。アプリを逆コンパイルしてリクエストを偽装するだけでなく、攻撃者はプロキシを使用して、正当なアプリに送信するデータをダンプすることができます。 –

+0

私はあなたを正しく理解していれば、安全に行う唯一の選択肢は、サーバーとアプリケーションの間の暗号化された接続を使用することです。 Httpsは大丈夫でしょうか?私は、使い方が簡単ではないことを理解しています。しかし、他に何か欠点がありますか?それはかなり遅いですね。私はちょうどこのデータの安全性が努力の価値があるかどうかを調べようとしています –

1

あなたのapkを誰かが逆コンパイルすると、あなたの文字列を簡単に見ることができます。

EDIT:私はこれを行うには良い方法があるとは思わない...多分唯一のAndroidコピープロテクションをAndroidマーケットでアプリケーションを公開する...基本的なルールの

+0

ご連絡ありがとうございます。逆コンパイルはかなり単純なプロセスです、と思いますか?つまり、デコンパイルされないという前提に頼るべきではありませんか?うーん、他にもいくつかのソリューションがあるはずです... –

+1

あなたはユーザーを認証でき、アプリケーションを認証できず、難しくすることができますが、その日の終わりにコードと秘密を悪人に出荷しています。 – superfell

+0

データがその価値を証明したら、おそらくそれを乗り越えたり、暗号化に投資したりするでしょう。つまり、私はそれが実現するのがとても難しいと非常に驚いています –

2

アプリケーションがサーバーとハンドシェイクを実行するように、アルゴリズムは単なる文字列ではなく、プロセス全体です。使用するセッション/あなたのハンドシェイクを追跡するためのデータベース

+1

そして、ハンドシェークはSSL経由で行われますね。だから、私たちがコメントで言いましたように、これはかなり同じことでしょう(ここではチェックサムを意味するものではありません)。しかし、このことがハンドシェイクと呼ばれることを知ってうれしいです、ありがとう! –

1

あなたは例えばのstrings.xmlにセットして、すべてのURLリンクやparamete名前をあなたのリンクを非表示にすることができます:USER_NAME http://wwww.yourdomain.com/yourpage.any とでそのようなURLを取得:

String serverUrl = Resources.getsystem().getstring(R.strings.name_your_link_id); String parameterKey = Resources.getsystem().getstring(R.strings.name_your_parameter_id); Uri url = Uri.parse(serverUrl+"?"+parameterKey+"=" + yorusername);

とhttpリクエストを行います。 HttpURLConnection con =(HttpURLConnection)url.openConnection();いずれかのアプリを逆コンパイルしようとすると、

彼はR.javaファイル内の唯一のIDと長整数はこの String serverUrl = Resources.getsystem().getstring(12346546564); String parameterKey = Resources.getsystem().getstring(123321321132);

+1

しかし、それはそれが少し煩わしいだけでなく、得ることは不可能ではないと思う。 * .apkファイルを解凍すると、文字列リソースはresources.arsc内にあります。だから彼らはまだそれらの数字に関連付けられています。しかし+1興味深い考えのために+1 –

1

ようなコードを取得し表示しますAndroidのは、(署名機関または自己署名入り)1が自分のアプリをsignすべきであることが必要ですそれがインストールされる前に。これを利用して、リクエストがあなたのアプリから来ているかどうかを確認することができます。

  1. 証明書を使ってアプリに署名します。
  2. Find証明書の署名を作成し、バックエンドサーバーに保存します。
  3. リクエストごとに、この署名がアプリによって送信されることを期待してください。
  4. サーバーレベルでアプリから送信された署名を検証し、一致する場合にのみ受け入れます。でも、誰かがあなたのアプリケーションを改ざんその場合の

は、彼はそれをインストールする前に、アプリの署名を変更するだろうし、私たちの検証メカニズムは、単純なすべてのそのような要求を拒否しており、再びそれに署名する必要があります。

この回答はthisブログに基づいています。アプリ< - >サーバー通信用にhttpsを使用してください。

+1

しかし、誰もあなたのアプリパッケージ名を使用してあなたのアプリハッシュを見つけるために署名コードを使用することができ、将来のリクエストでそのハッシュを送信を開始することができます。それでこのシグニチャがどのようにアプリを安全にしているのですか? –

+0

手順3を行う方法、それはAndroid OSのデフォルトの動作ですか? –

関連する問題