0

我正在尝试验证购买时收到的 android 帐单收据的真实性。验证是服务器端的,但我想如果有时服务器可能已关闭,我可能会检查应用程序本身的签名..

这是我在服务器上验证购买的方式..

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

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

// get key
$key_64 = "MY Base64 KEY FROM DEVELOPER CONSOLE";



$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 "verified";
} elseif ($ok == 0) {
    echo "unverified";
} else {
    die ("fault, error checking signature");
}

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

?>

那么如何在 Android 上做同样的事情呢?

4

1 回答 1

0

这是使用 Android 计费库的一种可能方法。您将需要来自 Play 控制台的应用程序的 Base64 编码的 RSA 公共许可证密钥。此处的说明告诉您如何找到它:

要查找此密钥对的公钥部分,请在 Play 管理中心中打开应用程序的详细信息,单击服务和 APIs [在开发人员工具下],然后查看标题为“此应用程序的许可证密钥”的字段。

现在对于方法:

    private boolean check_purchase_signature(String json, String signature) {

        final String LICENSE_KEY = "LONG_STRING_FROM_THE_PLAY_STORE_CONSOLE";
        final String TAG = getApplication().getPackageName(); // or whatever

        try {
            java.security.Signature sig = Signature.getInstance("SHA1withRSA");
            sig.initVerify(KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(
                    (Base64.decode(LICENSE_KEY,
                            Base64.DEFAULT)))));
            sig.update(json.getBytes());
            if (sig.verify(Base64.decode(signature, Base64.DEFAULT))) {
                Log.e(TAG, "Signature verification passed.");
                return true;
            }
        } catch (Exception e) {
            Log.e(TAG, "Signature verification failed.", e);
        }
        return false;
    }

您可以像这样检查任何购买的签名:

 check_purchase_signature(purchase.getOriginalJson(), purchase.getSignature());

注意这里的信息最初来自古代 IABHelper 的 Security 类。它只是归结为一种方法,还没有经过彻底的测试。

希望这可以帮助!

于 2019-10-27T02:19:36.807 回答