我是Android开发的新手,但创建了一个应用,我实施了应用内购买,以从应用中删除广告。我刚刚做了一个非常基本的实现,我基本上检查用户是否购买了“no_ads”项目,如果是真的,那么就不会显示任何广告。问题是我看到很多“购买”都记录在firebase上,而且没有在游戏控制台上记录,这当然意味着我的用户正在使用这些黑客应用程序。所以我的问题是,如何保护/验证这些购买服务器,所以这些haking应用程序是无用的?我已经有一个我的应用程序使用的服务器,所以为我实现任何服务器端代码都没有问题。如果有人能指点我一个教程,那就太棒了。感谢
答案 0 :(得分:5)
我在减少应用内购买欺诈方面做出的微薄贡献
在Android代码上的外部服务器上进行签名验证:
<强> verifySignatureOnServer()强>
private boolean verifySignatureOnServer(String data, String signature) {
String retFromServer = "";
URL url;
HttpsURLConnection urlConnection = null;
try {
String urlStr = "https://www.example.com/verify.php?data=" + URLEncoder.encode(data, "UTF-8") + "&signature=" + URLEncoder.encode(signature, "UTF-8");
url = new URL(urlStr);
urlConnection = (HttpsURLConnection) url.openConnection();
InputStream in = urlConnection.getInputStream();
InputStreamReader inRead = new InputStreamReader(in);
retFromServer = convertStreamToString(inRead);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (urlConnection != null) {
urlConnection.disconnect();
}
}
return retFromServer.equals("good");
}
<强> convertStreamToString()强>
private static String convertStreamToString(java.io.InputStreamReader is) {
java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A");
return s.hasNext() ? s.next() : "";
}
网页寄存的根目录verify.php
<?php
// get data param
$data = $_GET['data'];
// get signature param
$signature = $_GET['signature'];
// get key
$key_64 = ".... put here the base64 encoded pub key from google play console , all in one row !! ....";
$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);
?>
备注:强>
你应该加密你的java代码中的URL,如果不能通过你的解压缩应用程序中的简单文本搜索轻松找到URL apk
最好将php文件名,url参数,好/坏响应更改为无意义的内容。
如果不引发主线程异常上的网络,则verifySignatureOnServer()应该在一个单独的线程中运行。
希望它会有所帮助...
答案 1 :(得分:1)