是的,我已经阅读了所有的docs@developer.android.com,我确实理解所有这些,但有一个基本的例外——它是为什么而引入的。
由于google play的所有订单响应都是由任何人都无法访问的私钥签名的,并且是由成对的公钥验证的(在我的例子中是在外部服务器上,因此第三方也无法访问),所以根本(几乎)没有办法欺骗。
所有这些都只是确保购买安全的多余方式。更重要的是,当:
我买东西;
生成nonce并发送给google play;
撞车,所以我所有已知的瞬间都消失了;
重新启动我的应用程序并从google play获得回拨;
…由于未识别nonce而拒绝此呼叫!
在上面描述的情况下,用户为一个项目付费却永远得不到它,这是可耻的。当然,我可以将nonce存储在某个文件中,并在我的应用程序返回时重新读取它,但这违反了nonce的所有原则。
有人说:“嘿,验证过程太简单了,我们再加些随机的东西,会更酷的!”.
有人这么做了。
或者,你能让我对其他的用例敞开心扉吗?
否则我将从代码中删除整个nonce部分。
最佳答案
您不需要将nonce“存储到磁盘”来解释应用程序崩溃。
当你的应用程序崩溃是的时候,你会丢失你的已知nonce列表。但是,当你的应用程序重新启动,并且你收到一个IN_APP_NOTIFY
时,你必须执行另一个GET_PURCHASE_INFORMATION
当你这样做GET_PURCHASE_INFORMATION
时,你将生成一个新的nonce并将其添加到已知nonce列表中。
您需要记住的是nonce是每个GET_PURCHASE_INFORMATION
一个(它返回您购买的多个项目),而不是每个购买的项目一个nonce。
正如您所说,您已经实现了自己的方法来避免重播攻击,但是使用nonce曾经是一种安全的方法