代码之家  ›  专栏  ›  技术社区  ›  Tricky

保护付费iPhone应用程序所需的外部资源

  •  0
  • Tricky  · 技术社区  · 15 年前

    我开发了一个应用程序,目前在应用程序商店中,它的重量刚刚超过400MB。这主要是因为这个应用程序有很多视频,而这些视频目前已经被压缩成二进制文件。

    对于我们的下一个版本,我们希望将此视频外部化,允许用户下载他们希望保持按需播放的视频,并删除他们已经观看的视频。我们目前正在寻找一个cdn等,并正在努力解决如何保护这个视频。

    问题是,如果我们只使用mp4s的标准URL,没有应用程序的人就可以通过网络下载我们的付费客户视频。我们有没有办法保护这些视频,使它们不容易被盗?(我说“很容易”,因为我确信一旦视频被下载,人们总能找到方法把它们从应用程序中撕下来,放到Bit Torrent上,但如果他们在窃取,如果我们不必为带宽付费,那就好了…)

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

    这个问题的合理解决办法是什么?

    事先谢谢,

    更新: 不幸的是,我不能使用应用程序内的购买机制,因为这个应用程序确实很好,所以需要找到自己的方式来保护我们的内容。

    这是否可以作为一个解决方案:(请原谅我的白话,通常是客户端编码人员)

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

    2)一旦应用程序有了这个令牌,它就会使用这个令牌、设备udid和应用程序中烘焙的密钥,通过md5或其他方式生成另一个令牌。

    3)设备使用新令牌和设备udid向服务器发出请求

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

    这行吗?

    5 回复  |  直到 15 年前
        1
  •  2
  •   Paul Shoemaker    15 年前

    我认为你的建议与我的建议是一致的。

    以AmazonS3链接过期方法为例。我用PHP编写了以下帮助程序来生成这些链接(与Zend框架的Zend_uuuuuuuCrypt_uuuuuuhmac一起使用,请参见 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服务器、操作系统、服务器端代码库的总体效率等。这是一个更大的讨论。

    希望这有帮助!

        2
  •  1
  •   Lily Ballard    15 年前

    您可以免费提供应用程序,并在购买应用程序时提供视频。有一个API,您的服务器可以使用它来验证IAP收据,以确保客户实际上通过Apple合法购买了该商品。

        3
  •  0
  •   Jeff Kelley    15 年前

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

        4
  •  0
  •   Ben S    15 年前

    阅读 Server Product Model Verifying Store Receipts 应用程序内购买编程指南的章节。它解释了如何以一种相当安全的方式完成这项工作。

        5
  •  0
  •   zaph    15 年前

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