web-dev-qa-db-ja.com

Android非消耗品のアプリ内課金では、どのような保護対策が必要ですか?)

アプリケーションはAndroidリモートサービスのクライアントであり、すべてのユーザーがアカウントを持ち、非消耗品の購入を行うことができます。各購入は、購入したアカウントに関連付けられています。現在の購入スキームは次のとおりです。

  1. クライアントは、Google Playのアプリ内課金サービスで購入を開始します。購入リクエストには、アカウントを一意に識別するペイロードが含まれています。
  2. 購入が正常に完了すると、クライアントはペイロードと購入トークンを含む購入データを受け取ります。また、現在チェックされていない受信データの署名もあります。
  3. クライアントは購入トークンをサーバーに送信します。この時点で、認証する必要があります。
  4. サーバーは購入トークンを受け取ります。サーバーは、サービスアカウントキーを使用してGoogle Playサービスで認証し、指定されたトークンの購入データを受け取ります。データには、元のペイロードと購入に関する情報が含まれています。
  5. サーバーは購入データを検証します。ペイロードが現在ログインしているユーザーIDと一致すること、購入はまだ消費されておらず、支払いが正常に行われたことが確認されます。
  6. 検証が成功すると、クライアントがサーバーで製品を購入したことがマークされ、クライアントは確認を受け取ります。それ以外の場合、クライアントは拒否を受け取ります。

このスキームで何がうまくいかないのでしょうか?たとえば、署名がどこでも使用されていないことが心配です。ただし、サーバーがGoogle Playから直接データを受信する場合、その用途はわかりません。最悪の場合、間違ったトークンを受け取る可能性がありますが、ペイロードにはユーザーIDが含まれているため、別のアカウントで購入された場合、購入は拒否されます。同じトークンを2回送信しても、その製品は非消費型であるため、役に立たない:購入したか、購入していない。しかし、私はここで何かを見逃しているのでしょうか、それとも他に目に見えない欠陥があるのでしょうか?

2
Malcolm

質問の本当の意味がわかりません。

それが確認されていない場合、あなたの質問はもっとあると思います、署名は何に使用されていますか?また、ここで署名の用途を説明できます。署名は、基になるアカウントシステムがなく、Googleアカウントシステムも使用していない場合に使用されます。

その場合、署名された購入データをGoogleサーバーからアプリに受け取ります。ここで、ユーザーがそれを改ざんできる、つまり、購入していないものを購入したと改ざんできるという問題が発生します。

検証するUserIDもないため、購入トークンのみを使用した場合、ユーザーはトークンを互いに共有できます。

これが署名が効力を発揮するものです。アプリ/クライアント/ユーザーからデータを受け取ったら、有料サービスへのアクセスをレンダリングする前に、データが改ざんされていないことを確認できます。また、ここでは、リクエストでランダムなナンスを提供できます。これは、レスポンスで提供されます。ユーザーは自分の購入以外の購入の購入データを取得できないため、プレミアムコンテンツの共有を効果的に防止できます。

スキームの上に購入データの検証を追加すると、さらに安全になりますが、この場合、UserIDに対してトークンを検証しているので、これは必要ありません。

1

あなたは正しいです、私もこのスキームで何の問題も見ていません。 Googleが架空の購入についてサーバーに嘘を付け始めた場合、その時点では支払いプロバイダーを完全に切り替える必要があるため、署名が役立つとは思えません。

1
André Borie