セキュリティとデザイン

アプリ内課金を設計する際は、このドキュメントにある、セキュリティとデザインのガイドラインに沿ってください。 こちらのガイドラインは、Google Play のアプリ内課金の全利用者向けの推奨ベスト プラクティスです。

セキュリティに関するベストプラクティス

サーバーで認証確認を行う

実用的であれば、署名認証は端末ではなくリモート サーバー上で行う必要があります。認証プロセスをサーバー上に実装することで、ハッカーが .apk ファイルをリバース エンジニアリングして、認証プロセスを解読するのを防ぐことができます。 リモート サーバーに対して、オフロード セキュリティ プロセスを行う場合、端末とサーバー間のハンドシェイクが安全であることを確認してください。

ロックフリー コンテンツの保護

悪意のあるユーザーによって、ロックフリー コンテンツを再配信されるのを防ぐために、.apk ファイルでバンドルしないようにします。 代わりに次のいずれかを行ってください。

  • コンテンツ フィードなどのリアルタイム サービスを使ってコンテンツを配信する。リアルタイム サービス経由でコンテンツを配信すると、自身のコンテンツは新しいまま保持されます。
  • コンテンツの配信にリモート サーバーを使用する。

リモート サーバーまたはリアルタイム サービスからコンテンツを配信すると、ロックフリー コンテンツを端末メモリや端末の SDカードに保存できます。 SDカードに保存する場合には、必ずコンテンツを暗号化し、端末に固有の暗号化キーを使用してください。

コードの難読化

ハッカーがセキュリティ プロトコルとその他アプリのコンポーネントをリバース エンジニアリングするのを防ぐため、アプリ内課金コードを難読化する必要があります。 最低でもコード上で Proguard などの難読化ツールを実行することをお勧めします。

難読化プログラムの実行に加え、次のテクニックを利用してアプリ内課金コードを難読化することを推奨します。

  • メソッドを別のメソッド内に組み込む。
  • 定数として定義する代わりに、状況に応じて文字列を作成する。
  • Java のリフレクションを利用してメソッドを呼び出す。

これらのテクニックにより、アプリの攻撃対象領域を減らし、アプリ内課金の実装を危殆化する攻撃を最小限に抑えることができます。

注: コードの難読化に Proguard を使う場合、Proguard の設定ファイルに次の一行を追加する必要があります。

-keep class com.android.vending.billing.**

全サンプルアプリのコード修正

アプリ内課金サンプルアプリは一般に公開されており、誰でもダウンロードできます。つまり、公開されたままのサンプルコードを使っていると、ハッカーによって比較的容易にアプリをリバース エンジニアリングされてしまいます。 サンプルアプリはあくまで例として使うことを想定しています。 サンプルアプリの一部を使う場合には、公開前に修正するか、商品版のアプリの一部としてリリースする必要があります。

特に、ハッカーは既知のエントリポイントとエグジットポイントを狙うため、自身のコードにおいて、これらのサンプルアプリと同一の部分を修正しておくことが重要です。

安全なランダム ノンスの使用

ノンスは予測不可で、再利用不可でなければなりません。ノンスを生成する際は、必ず暗号的に安全な乱数ジェネレータ(例: SecureRandom)を使用します。 これにより、リプレイ アタックを軽減できます。

また、サーバー上でノンスの照合を行う場合には、必ずサーバーでノンスを生成してください。

購入リクエスト時のデベロッパー ペイロード文字列の設定

In-app Billing Version 3 API では、Google Play に購入リクエストを送信するときに「デベロッパー ペイロード」文字列トークンを含めます。 これは一般的に、購入リクエストを一意に識別する文字列トークンを渡すために使われます。文字列の値を指定すると、Google Play は購入レスポンスとこの文字列を合わせて返します。 その後、この購入に対するクエリを作成すると、Google Play は購入詳細とこの文字列を合わせて返します。

アプリ側で、購入したユーザーを識別できるようにするには、文字列トークンを渡すす必要があります。これにより、ユーザーによる購入が正式なものであることを後から確認できます。 消費可能アイテムに対しては、ランダムに生成した文字列を使えますが、消費不可のアイテムに対しては、ユーザーを一意に識別する文字列を使う必要があります。

注: ユーザーのメールアドレスは変更される可能性があるため、ペイロード文字列には使用しないでください。

Google Play からのレスポンスが返ってきたら、デベロッパー ペイロード文字列が、購入リクエストと一緒に以前送ったトークンと一致することを確認します。 さらなるセキュリティ強化のため、この確認は自身の安全なサーバー上で行ってください。

商標と著作権違反に対する措置

自身のコンテンツが Google Play で再配信されているのを発見したら、躊躇せずに迅速に行動しましょう。商標違反の報告または著作権違反の報告で申し立てを提出します。

ロックフリー コンテンツの取り消しスキームの実装

コンテンツの配信と管理にリモートサーバーを使用している場合、ユーザーがコンテンツにアクセスした際は必ず、ロックフリー コンテンツの購入状況を確認しておきます。 これにより、必要に応じて利用を取り消し、侵害行為を最小限に抑えることができます。

Google Play 公開鍵の保護

悪意のあるユーザーやハッカーから自身の公開鍵を守るためには、いかなるコードにおいても文字列リテラルに鍵を埋め込まないようにします。 その代わりに、実行時に文字列を一から作成するか、ビット操作をして(例: 他の文字列との排他的論理和をとる)実際の鍵を隠します。 鍵自体は秘密情報ではありませんが、ハッカーや悪意のあるユーザーによって簡単に公開鍵を別の鍵にすり替えられないようにする必要があります。