web-dev-qa-db-ja.com

別のサーバーを使用する場合、アプリ内Android支払いをどのように保護する必要がありますか?

私は現在、Android=アプリ内決済を実装しており、どの攻撃ベクトルに注意すべきか疑問に思っています。

サーバーで生成されたコンテンツを表示する単純なアプリケーションがあります。ユーザーがアプリ内で追加のアクセス権を購入できるようにしたいのですが、成功したトランザクションをサーバーに通信する方法を知りたいです。

Androidアプリ内決済の仕組みの概要:

  • アプリはユーザーにAndroid=購入する製品の市場を表示します
  • 取引が完了すると、アプリからマーケットに通知されます。
  • アプリはnonceを使用してトランザクション情報をリクエストします。
  • Googleは、トランザクションレコードを含む応答をアプリに送信し、ノンスを繰り返し、開発者固有の秘密鍵で署名します。
  • アプリはnonceと署名(+公開鍵)を使用してデータをチェックできます。
  • [更新]:Androidトランザクションには常にタイムスタンプが含まれ、アプリはGUIDを追加してクライアントを識別します。両方とも署名済みトランザクションレコードにあります)

詳細はこちら: http://developer.Android.com/guide/market/billing/index.html

私の現在の計画は、完全なトランザクションレコードをサーバーに送信し、サーバーの公開キーと照合することです。

私が持っているいくつかの質問:

  • 私の計画は本質的に欠陥がありますか?
  • Nonceサーバー側も生成して確認することは望ましいですか?とにかくそのnonceが使用されているのはなぜですか?
  • サーバーと通信するときにHTTPSを使用する必要がありますか(推奨)?

私は個人データや極秘データを保護していませんが、攻撃者にとって簡単にしたくはありません。

9
beetstra

私が目にする可能性のある欠陥は、あなたが2番目の質問で尋ねるものです。サーバー側のすべてを再確認し、クライアントで行われたすべてのもの(自分のアプリからのものであっても)を信頼できないものとして扱うことをお勧めします。この特定のケースでは、固有の問題はありませんが、クライアント側では、欠陥が発見された場合にのみドアが開いているかどうかをチェックします。

Nonceは、* nixシステムがパスワードを保管する方法と同様に、トランザクションのソルトのように機能します。ナンスは、キーで暗号化された値にエントロピーを追加するために使用され、2つのトランザクションが暗号化されて同じ署名が作成される可能性や、その他の同様の暗号攻撃が大幅に排除されます。

私は偏執狂として、あなたが両替するお金について話しているとき、HTTPSで通信する必要があると言います。平文の送信で、スターバックスで完全なトランザクションレコードを傍受し、それらを自分のトランザクションとして送信するなど、厄介なアクションの中で何ができなくなりますか?

6
queso