我花了一些时间才弄清楚如何在ASP.NET中验证Google Play In-App计费签名,因此我想在StackOverflow上分享我的做法。
正如实施应用内计费 (IAB 版本 3)所述:
为了确保向您的应用发送的交易信息的完整性,Google Play 对包含购买订单响应数据的 JSON 字符串进行签名。Google Play 使用与您的应用在开发者控制台中关联的私钥创建此签名。开发者控制台为每个应用程序生成 RSA 密钥对。
注意:要查找此密钥对的公共密钥部分,请在开发者控制台中打开您应用的详细信息,然后单击“服务和 API”,并查看标题为“此应用的许可证密钥”的字段。
由Google Play生成的Base64编码的RSA公钥是二进制编码、X.509 subjectPublicKeyInfo DER SEQUENCE格式的。这是与Google Play许可一起使用的相同的公钥。
当您的应用收到此签名响应时,您可以使用您RSA密钥对的公钥部分来验证签名。通过执行签名验证,您可以检测到已篡改或伪造的响应。您可以在应用程序中执行此签名验证步骤;但是,如果您的应用程序连接到安全远程服务器,则建议您在该服务器上执行签名验证。
我将自己回答这个问题,提供我编写的代码来解码DER序列格式中的二进制编码、X.509公钥,并使用.Net RSA API验证签名。
正如实施应用内计费 (IAB 版本 3)所述:
为了确保向您的应用发送的交易信息的完整性,Google Play 对包含购买订单响应数据的 JSON 字符串进行签名。Google Play 使用与您的应用在开发者控制台中关联的私钥创建此签名。开发者控制台为每个应用程序生成 RSA 密钥对。
注意:要查找此密钥对的公共密钥部分,请在开发者控制台中打开您应用的详细信息,然后单击“服务和 API”,并查看标题为“此应用的许可证密钥”的字段。
由Google Play生成的Base64编码的RSA公钥是二进制编码、X.509 subjectPublicKeyInfo DER SEQUENCE格式的。这是与Google Play许可一起使用的相同的公钥。
当您的应用收到此签名响应时,您可以使用您RSA密钥对的公钥部分来验证签名。通过执行签名验证,您可以检测到已篡改或伪造的响应。您可以在应用程序中执行此签名验证步骤;但是,如果您的应用程序连接到安全远程服务器,则建议您在该服务器上执行签名验证。
我将自己回答这个问题,提供我编写的代码来解码DER序列格式中的二进制编码、X.509公钥,并使用.Net RSA API验证签名。