/**
* 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) {
我想知道,在服务器端执行此类验证如何使应用程序更安全?
因为,我想黑客可以简单地
- 强制
verifyValidSignature
返回 true,甚至无需与服务器端通信。 - 我相信应用程序代码,会有像
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/