问题
用户在我的应用中进行了购买,但Google在其记录中没有任何痕迹。我想知道我的应用程序的安全性是否受到损害,或者我是否怀疑它是否存在于Google端。
上下文
我使用离子框架(角度)开发了一个混合应用程序。该应用程序支持应用程序结算,借助Android的cordova插件开源:https://github.com/poiuytrez/AndroidInAppBilling
该应用已部署在Play商店中,已经缩小和使用。
购买流程调用处理交易的插件,当交易完成(用户完成付款)时,插件会从Google收到有效负载。
inappbilling.buy(success, fail, productId)
示例有效负载
{
"orderId":"12999763169054705758.1385463868367493",
"packageName":"com.example.myPackage",
"productId":"example_subscription",
"purchaseTime":1397590291362,
"purchaseState":0,
"purchaseToken":"ndglbpnjmbfccnaocnppjjfa.AO-J1Ozv857LtAk32HbtVNaK5BVnDm9sMyHFJkl-R_hJ7dCSVTazsnPGgnwNOajDm-Q3DvKEXLRWQXvucyW2rrEvAGr3wiG3KnMayn5yprqYCkMNhFl4KgZWt-4-b4Gr29_Lq8kcfKCkI57t5rUmFzTdj5fAdvX5KQ",
"receipt":"{...}",
"signature":"qs54SGHgjGSJHSKJHIU"
}
然后我将该有效负载发送到REST API。 API使用随每个请求发送的签名JWT令牌进行保护。在服务器端,JWT令牌被解码以获得用户ID。然后我将有效负载存储在用户实体中。
然后我用node-iap手动检查有效负载。我得到以下响应,这意味着有效载荷是合法的。
实际验证
{
receipt:{
kind:'androidpublisher#productPurchase',
purchaseTimeMillis:'1436002850700',
purchaseState:1,
consumptionState:1,
developerPayload:''
},
transactionId:'ofnjgihgpabbodngadeegagl.AO-J1OwBenqmX7tCt_XeW3bgDYMnxxxKqNi8x8Q_yuKsbDW5VFWm6WyDfbYAaCiyF2-BJFI4Sy6o2UGHwvPdY7X6qz0O_k64BBRYTot5W7z5bfpXQ391QbAhD0',
productId:'paid.pro',
platform:'google'
}
假设
免责声明:我的安全知识水平非常低。
假设用户在购买过程成功时找到了要调用的API端点。他有签名的JWT令牌,因为它在登录后存储在本地存储中。他必须生成一个有效载荷并使用JWT令牌发送它。
我检查时生成的有效负载似乎有效。这怎么可能?他是否设法获取我的私钥?
答案 0 :(得分:0)
没有人拿到你的私钥。您的有效负载未使用公钥/私钥进行签名,只有您的令牌使用私钥进行签名。 因此,无论您使用有效令牌发送到服务器,都将被接受。