android - 如何在服务器端使用开发者的公钥验证购买是否正确签名将使应用程序更安全?

标签 android in-app-purchase in-app-billing

基于应用内购买代码示例 https://github.com/googlesamples/android-play-billing/blob/master/TrivialDrive_v2/shared-module/src/main/java/com/example/billingmodule/billing/BillingManager.java#L369

/**
 * Verifies that the purchase was signed correctly for this developer's public key.
 * <p>Note: It's strongly recommended to perform such check on your backend since hackers can
 * replace this method with "constant true" if they decompile/rebuild your app.
 * </p>
 */
private boolean verifyValidSignature(String signedData, String signature) {

我想知道,在服务器端执行此类验证如何使应用程序更安全?

因为,我想黑客可以简单地

  1. 强制 verifyValidSignature 返回 true,甚至无需与服务器端通信。
  2. 我相信应用程序代码,会有像isThisPaidUser()这样的函数。黑客可以简单地让这些函数返回真值。

请问“在您的后端执行此类检查”如何更好?

最佳答案

您可以为此使用多种语言。 首先,避免使用 bool 变量,服务器返回的可以是字符串“whatever”,这里是一个例子:

<?php 
// get data param
$data = $_GET['data'];

// get signature param
$signature = $_GET['signature'];

// get key
$key_64 = "";



$key =  "-----BEGIN PUBLIC KEY-----\n".
    chunk_split($key_64, 64,"\n").
    '-----END PUBLIC KEY-----';
//using PHP to create an RSA key
$key = openssl_get_publickey($key);


// state whether signature is okay or not
$ok = openssl_verify($data, base64_decode($signature), $key, OPENSSL_ALGO_SHA1);
if ($ok == 1) {
    echo "good";
} elseif ($ok == 0) {
    echo "bad";
} else {
    die ("fault, error checking signature");
}

// free the key from memory
openssl_free_key($key);

?>

在客户端你可以使用一个小库 StringCare/AndroidLibrary 用于加密字符串并比较服务器的结果:

result.toString().equals("ecryptedstring")

如果攻击者使用 apktool、jadx 或其他工具查看代码,他将无法轻松解密字符串,lib 使用 java Cipher 为您的字符串生成 X509Certificate,StringCare 需要您的最终指纹app for this,但是 .equals 可以替换为 equals (true) 你需要更好的混淆,也许使用具有延展性的 xor 和嵌套的 try-catch 并使用流行的库测试它使用黑客。

一个更复杂的系统是使用 in-app-purchase npm lib 将 purchase.sku, purchase.purchaseToken 发送到 google api 服务器。有助于验证订阅和其他内容。

关于android - 如何在服务器端使用开发者的公钥验证购买是否正确签名将使应用程序更安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56925014/

相关文章:

iphone - 在 App Purchase 中没有返回任何响应

testing - 为什么 IAP 产品数量为空?

iOS - 应用内购买 - 产品标识符无效

Android In App Billing 仅在 Samsung tab 10.1 中崩溃

android - 使用 ListView 在 Android 中创建类似 iPhone 的滚轮

android - 何时保存文档

android - 如何在 dotnet core 上实现服务器端 google 授权

android - 无法更改应用内结算的默认货币

android - 在对话框类中完成 Activity

android - 在 CoordinatorLayout 上以编程方式隐藏/显示工具栏