to top

Security and Design

As you design your in-app billing implementation, be sure to follow the security and design guidelines that are discussed in this document. These guidelines are recommended best practices for anyone who is using Google Play's in-app billing service.

Security Best Practices

Perform signature verification tasks on a server

If practical, you should perform signature verification on a remote server and not on a device. Implementing the verification process on a server makes it difficult for attackers to break the verification process by reverse engineering your .apk file. If you do offload security processing to a remote server, be sure that the device-server handshake is secure.

Protect your unlocked content

To prevent malicious users from redistributing your unlocked content, do not bundle it in your .apk file. Instead, do one of the following:

  • Use a real-time service to deliver your content, such as a content feed. Delivering content through a real-time service allows you to keep your content fresh.
  • Use a remote server to deliver your content.

When you deliver content from a remote server or a real-time service, you can store the unlocked content in device memory or store it on the device's SD card. If you store content on an SD card, be sure to encrypt the content and use a device-specific encryption key.

Obfuscate your code

You should obfuscate your in-app billing code so it is difficult for an attacker to reverse engineer security protocols and other application components. At a minimum, we recommend that you run an obfuscation tool like Proguard on your code.

In addition to running an obfuscation program, we recommend that you use the following techniques to obfuscate your in-app billing code.

  • Inline methods into other methods.
  • Construct strings on the fly instead of defining them as constants.
  • Use Java reflection to call methods.

Using these techniques can help reduce the attack surface of your application and help minimize attacks that can compromise your in-app billing implementation.

Note: If you use Proguard to obfuscate your code, you must add the following line to your Proguard configuration file:

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

Modify all sample application code

The in-app billing sample application is publicly distributed and can be downloaded by anyone, which means it is relatively easy for an attacker to reverse engineer your application if you use the sample code exactly as it is published. The sample application is intended to be used only as an example. If you use any part of the sample application, you must modify it before you publish it or release it as part of a production application.

In particular, attackers look for known entry points and exit points in an application, so it is important that you modify these parts of your code that are identical to the sample application.

Use secure random nonces

Nonces must not be predictable or reused. Always use a cryptographically secure random number generator (like SecureRandom) when you generate nonces. This can help reduce replay attacks.

Also, if you are performing nonce verification on a server, make sure that you generate the nonces on the server.

Take action against trademark and copyright infringement

If you see your content being redistributed on Google Play, act quickly and decisively. File a trademark notice of infringement or a copyright notice of infringement.

Implement a revocability scheme for unlocked content

If you are using a remote server to deliver or manage content, have your application verify the purchase state of the unlocked content whenever a user accesses the content. This allows you to revoke use when necessary and minimize piracy.

Protect your Google Play public key

To keep your public key safe from malicious users and hackers, do not embed it in any code as a literal string. Instead, construct the string at runtime from pieces or use bit manipulation (for example, XOR with some other string) to hide the actual key. The key itself is not secret information, but you do not want to make it easy for a hacker or malicious user to replace the public key with another key.