保护付费iPhone App所需的外部资源

时间:2009-11-11 19:37:51

标签: php security iphone

我开发了一款目前在应用程序商店中的应用程序,重量超过400MB。其主要原因是该应用程序具有大量视频,目前已融入二进制文件。

对于我们的下一个版本,我们希望将此视频外部化,允许用户下载他们希望按需保存的视频,并删除他们已经观看过的视频。我们目前正在寻找CDN等,现在正试图弄清楚我们如何保护这个视频。

问题是,如果我们只是使用标准网址到mp4s,没有该应用程序的人将能够下载我们的视频,用于通过网络向客户付费。我们有什么方法可以保护这些视频,使它们不容易被盗? (我说“很容易”,因为我确信一旦下载了视频,人们总能找到将它们从应用程序中撕掉并将它们放在有点洪流上的方法,但是如果它们正在偷窃,那么如果我们没有这样做会很好我必须支付带宽......)

我在想,也许我们可以以某种方式生成一次性网址,这些网址是使用设备的UDID的某种哈希请求,然后在服务器上验证,然后允许用户通过它下载。或者这只是胡说八道?

这个问题的明智解决方案是什么?

提前致谢,

更新: 不幸的是,我无法使用应用程序购买机制,因为这个应用程序非常真实,所以需要找到我自己保护内容的方式。

这是否可以解决问题:(原谅我的白话,通常是客户端编码员)

1)服务器端,每5-10分钟生成一个随机令牌,可由应用程序请求。

2)一旦app有了这个令牌,它就会使用它,设备UDID和应用程序中的一个秘密密钥,通过md5或其他东西生成另一个令牌

3)设备使用NEW令牌和设备UDID

向服务器发出请求

4)服务器尝试通过重复相同的进程服务器端(使用相同的魔术键)进行验证,并查看它使用提供的udid生成的令牌是否与应用程序发出请求的令牌相匹配。如果是这样,它会传递文件。

这会有用吗?

5 个答案:

答案 0 :(得分:2)

我认为您的建议与我的建议一致。

查看Amazon S3方法以链接到期时的示例。我在PHP中编写了以下帮助程序以生成这些链接(与Zend Framework的Zend____Crypt____Hmac一起使用,请参阅http://framework.zend.com/wiki/pages/viewpage.action?pageId=35309以获取更多信息):

    public function getExpiredQueryString($objectName, $expireTime, $bucketName){
          $stringToSign = "GET\n\n\n$expireTime\n/$bucketName/tracks/$objectName";
          $hashedSignature = Zend_Crypt_Hmac::compute(self::AMAZON_AWS_SECRET_KEY, 'sha1', utf8_encode($stringToSign));
          $signature = urlencode($this->_hex2b64($hashedSignature));

          $url = 'http://' . $bucketName . '.s3.amazonaws.com/tracks/' . $objectName . '?AWSAccessKeyId=' . self::AMAZON_AWS_KEY . '&Expires=' . $expireTime . '&Signature=' . $signature; 
          return $url;
    }

以下是_hex2b64的内容(非原创,但有助于查看):

    private function _hex2b64($str){
          $raw = '';
          for ($i=0; $i < strlen($str); $i += 2)
          {
              $raw .= chr(hexdec(substr($str, $i, 2)));
          }
          return base64_encode($raw);   
     }

它的长短之处在于您可以创建一个标记化的链接结构,该结构可能在数据库表(例如)中具有ttl,用于对您的用户进行身份验证并授权您的资产的下载/流。

就可扩展性而言,您需要探索所有选项,包括数据库选择,Web服务器,操作系统,服务器端代码库的整体效率等。这是一个更大的对话。

希望这有帮助!

答案 1 :(得分:1)

您可以免费提供该应用,并将视频作为应用内购买提供。您的服务器可以使用API​​来验证IAP收据,以确保客户通过Apple实际合法地购买了该项目。

答案 2 :(得分:0)

您可以随时让iPhone应用程序向服务器发送包含其IP地址的请求;然后,在您的服务器上,返回仅允许访问该IP的下载URL。

答案 3 :(得分:0)

阅读In App Purchase编程指南的Server Product ModelVerifying Store Receipts部分。它解释了如何以相当安全的方式做到这一点。

答案 4 :(得分:0)

我发现加密数据效果很好。让iPhone发送一个随机密钥,用服务器上的密钥加密,在iPhone上解密。在CBC模式下使用AES,128位。如果你想要更好的性能,你可能会考虑只加密文件的一部分,比如说10%的块在文件上均匀分布,这是一个权衡,结果视频不值得观看与保存的加密时间。