【问题标题】:In-app Billing API (IAB Version 3) SecurityIn-app Billing API(IAB 版本 3)安全性
【发布时间】:2014-01-23 13:12:17
【问题描述】:

现在我是第一次添加 IAB。我已经阅读了文档,下载了示例,它似乎可以工作。 但是,设置不是我的问题,我想了解 Google 的以下两条建议,它们应该可以提高安全性

  • 加密公钥

如果攻击者反编译我的应用程序,他还可以删除我的加密、字符串拆分或位移位的东西。

  • 开发者负载

这里也一样。其实我可以按照谷歌推荐的方式来做。我的服务器上有用户 ID,可以将其用于请求并在之后进行比较……但我认为当我的应用被反编译时,很容易从代码中删除此逻辑。

我使用 Proguard 混淆了我的代码,并且我总是在将我的应用程序上传到 Google Play 之前对其进行反编译,以查看它是否工作并且设置是否正确。这就是为什么我说这两个建议不会带来很大的安全优势。

我也知道私钥/公钥系统是如何工作的。这就是为什么我可以说不反编译就不可能让我的应用程序与“假”服务器通信。如果 Google 不使用某种异步加密,我可能会理解为什么我必须检查响应是否来自假服务器......

你能帮我理解吗?

干杯, 斯蒂芬

【问题讨论】:

    标签: android in-app-purchase in-app-billing


    【解决方案1】:

    安全性就是在投入精力破解您的应用程序和从破解应用程序中获得收益之间进行权衡。如果您的应用程序花费 99 美分,而黑客需要 3 个小时来破解它,并且他需要一次又一次地破解每个新版本,那么花时间破解它是没有意义的,尽管他在技术上可以做到这一点。只需实施尽可能多的安全措施,让您的应用成为黑客的目标即可。

    不安全存储的公钥将允许攻击者轻松地用自己的公钥替换它。如果您的公钥被替换,那么您的应用程序将成功验证攻击者服务器签名的响应。这就是为什么您需要在应用程序中查找和替换您的公钥变得更加困难。

    开发负载。 当攻击者试图给你的应用一个有效的签名响应返回时,它用于保护你的应用免受攻击,该响应已被另一个用户的另一个购买使用过去。例如,我过去购买了您的应用程序的扩展,并以字节形式存储了 Google Play 响应。如果您的代码无法区分两个有效响应,那么我可以将此响应提供给其他用户,他们可以将其用于进一步购买。这就是为什么 Google 建议添加一个开发有效负载,您可以在返回有效响应时进行验证。在一个简单的情况下,这可以是用户的电子邮件。在更复杂的情况下,您需要一个服务器,它会为用户的购买生成一个字符串并将其存储在数据库中。稍后,当响应返回时,它将再次验证该响应生成的字符串。

    我希望这能让您更好地理解为什么需要这样做。

    【讨论】:

    • 感谢您的回复。我还是不明白。我不明白黑客如何给我一个有效的签名回复。您需要私钥来创建有效的签名。如果这个系统不安全,那么所有网上银行(实际上是所有 https)网站都不会安全。我已经添加了开发人员有效负载,但我不喜欢它,因为我需要两个额外的网络调用...
    • 像黑客一样思考。我根我的设备并以这种方式检测 Google Play 应用程序,它存储真正有效的签名响应。我曾经从你那里买过东西,我有这个回应。现在我可以将此响应提供给任何其他用户,如果用户可以用此响应替换真实响应,您的应用将始终接受它。
    • Aaaahhh... 我想我开始明白了 :) 当我不放置自定义有效负载时,响应已正确签名但未绑定到任何人或任何东西。这就像一个通配符 ^^ 只有当我放置一个自定义有效负载时,该包的哈希(指纹)才会改变......我是对的吗?但这意味着使用用户帐户(电子邮件?)作为有效负载可能就足够了。所以我可以删除我的两个网络调用并且不需要服务器,对吧?
    • 但如果是你描述的方式,我想知道为什么谷歌不把像 TimeStamp 这样的东西放到包中,这样它就不能被重用......
    • 您的应用将如何验证应用未添加(含义未知)的时间戳?你需要你的应用知道什么以及它可以验证什么。如果您愿意,也可以使用时间戳。但这是您必须设置它的应用程序。我使用随机生成的字符串,它工作得很好。
    猜你喜欢
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 2013-04-10
    • 2015-05-15
    • 1970-01-01
    • 2012-03-13
    • 2012-11-29
    相关资源
    最近更新 更多