我的服务器如何安全地验证iPhone应用内购买?

我的服务器如何安全地验证iPhone应用内购买?,iphone,authentication,iphone-sdk-3.0,certificate,in-app-purchase,Iphone,Authentication,Iphone Sdk 3.0,Certificate,In App Purchase,请看苹果公司的图表,了解最新情况 在第9步中,服务器如何知道它正在与有权购买的iPhone通话,并且Eve没有使用不诚实获得的收据进行重播 收据可能是有效的,但这不能证明发件人是有权利的一方 iPhone上有没有可以用来签署收据的设备证书 有没有办法将回执绑定到设备,或者将回执绑定到iTunes帐户和设备,以便服务器可以验证?苹果提供的易受攻击的方法 服务器可以通过以下方式验证购买: iPhone应用程序在购买后会收到一条消息。让iPhone对其进行编码(您可以使用此开源软件)并将其发送到您的服

请看苹果公司的图表,了解最新情况

在第9步中,服务器如何知道它正在与有权购买的iPhone通话,并且Eve没有使用不诚实获得的收据进行重播

收据可能是有效的,但这不能证明发件人是有权利的一方

iPhone上有没有可以用来签署收据的设备证书


有没有办法将回执绑定到设备,或者将回执绑定到iTunes帐户和设备,以便服务器可以验证?

苹果提供的易受攻击的方法

服务器可以通过以下方式验证购买:

  • iPhone应用程序在购买后会收到一条消息。让iPhone对其进行编码(您可以使用此开源软件)并将其发送到您的服务器。(您甚至可以按原样发送,并在验证之前让服务器base64对其进行编码。)

  • 让您的服务器发送一个JSON请求,其中包含一个密钥
    接收数据
    ,base64编码为
    https://buy.itunes.apple.com/verifyReceipt
    使用HTTP POST。(有关如何使用各种服务器端语言执行此操作的说明)

  • 服务器将使用带有两个键的JSON对象进行响应:
    status
    是一个整数,
    receive
    是重复的回执

  • 如果状态为零,则应接受收据有效,非零值表示收据无效

    苹果方法的安全补充

    但是,存在一些安全问题。用户可以使用另一个用户的收据,因为设备与收据没有关联,或者用户可以使用另一个产品的收据,因为服务器没有验证收据的产品id。为确保不会发生这种情况,您还应执行以下操作:

  • 当您第一次在应用程序中获得收据时,请立即通过安全通道(如HTTPS或SSL套接字)将其与一起发送到服务器。不要将其存储在任何地方,请将其保留在内存中

  • 在服务器上,将UUID和收据对存储在数据库中

  • 当设备发送UUID和回执对时,请使用数据库验证回执是否尚未使用,并通过检查回执来确保回执确实是针对您的产品的。收据只是一个JSON对象,因此服务器可以通过解码base64中的收据来读取内容

  • 通过安全通道向设备返回响应,告知购买是否:

    • 已验证为新的(不在DB中且有效)
    • 过去已验证(数据库中已存在相同的UUID和收据对)
    • 由于产品id错误而被拒绝
    • 由于已将收据与另一个UUID一起使用而被拒绝
  • 由于收据仅存在于设备的内存中,并且您的应用程序使用设备的UUID(可以是,请参阅注释),并且您的产品的所有购买都以安全的方式在服务器上使用设备的UUID进行记录;用户不能使用另一用户的收据来验证购买,也不能使用另一产品的收据,因为您检查了该收据

    如果要验证交易的其他详细信息,还可以验证收据中的其他字段。例如,如果您的产品是订阅,您还需要查看交易日期

    此外,用户不能通过将设备放在与您的主机同名的专用网络上来假装是您的服务器,因为他们没有您的SSL证书

    故障注意事项

    由于故障可能发生在用户设备获取收据和与服务器验证收据之间(例如,如果用户断开连接,或服务器因维护而停机),因此您还应让用户“重新授权”。重新授权应该从商店获得收据(使用),并将其重新发送到服务器,就像这是一次新购买一样。这应该很少需要使用,但应该可以避免用户在网络故障的情况下重新购买产品

    多设备考虑事项

    这意味着,如果用户希望在多个设备上使用应用程序,他们将不得不多次购买该产品。这可能是您想要的效果,但您可能应该在用户购买之前通知他们,因为他们可能希望能够跨与帐户关联的设备使用内容


    如果收据还包含iTunes帐户信息,则身份验证可以使用该信息允许用户在所有设备(但不是他们的朋友)之间共享内容。

    我认为这无法将收据绑定到设备


    我的理解是,您可以在多个设备上安装应用程序,而无需额外费用。将其绑定到设备意味着,例如,如果您升级/更换手机,您需要再次购买所有应用。

    我相信,如果您无法读取用户的苹果ID,您唯一的防盗版保护将是跟踪(当然是服务器端)每个事务id的下载请求数,如果超过某个值,则限制这些请求数

    因此,如果将其限制在50,用户就可以在多台设备上部署应用程序及其内容并进行多次恢复,但对于任何想要发布盗版版本并获得无限恢复的有效收据的人来说,这都是一个合理的余地。当然,他们可以发布一个包含你所有内容的版本,但你对此无能为力,至少他们不会让你的服务器负担过重。

    UDID不再有效 贝尼奥特的答案是伟大的,然而,这些天,正如乔·德安德里亚所提到的,UDID被弃用了,而我最后一次尝试的时候,一个应用程序