我已经开发了一个应用程序,目前在应用程序商店中,重量超过400MB。主要原因是该应用程序具有大量视频,这些视频目前已被烘焙到二进制文件中。
对于我们的下一个版本,我们希望将此视频外部化,允许用户下载他们想要保留的视频,并删除他们已经看过的视频。我们目前正在采购CDN等,现在正在努力解决我们如何保护这个视频。
问题是,如果我们只使用mp4s的标准urls,没有应用程序的人将能够通过网络下载我们的视频,这意味着我们将为付费客户提供服务。我们有没有办法保护这些视频,使它们不会轻易被窃取?(我说“很容易”,因为我相信一旦下载了视频,人们总能找到方法将它们从应用程序中删除,并将它们放到bit torrent上,但如果他们在偷窃,如果我们不需要支付带宽费用就好了……)
我在想,也许我们可以以某种方式生成一次性的urls,这些urls是使用设备的UDID的某种散列请求的,然后在服务器上进行验证,然后允许用户通过该urls进行下载。或者这只是一派胡言?
这个问题的合理解决方案是什么?
提前谢谢你,
更新:不幸的是,我不能使用应用程序内购买机制,因为这个应用程序是好的和真正的存在,所以需要找到我自己的方式来保护我们的内容。
这可以作为一种解决方案吗:(请原谅我的术语,通常是客户端程序员)
1)服务器端,每隔5-10分钟生成一个随机令牌,app可以请求。
2)一旦应用程序有了这个令牌,它就会使用此令牌、设备UDID和在应用程序中烘焙的密钥通过md5或其他方式生成另一个令牌
3)设备使用新令牌和设备UDID向服务器发出请求
4)服务器尝试验证,方法是在服务器端(使用相同的魔术密钥)重复相同的过程,并查看它使用提供的udid生成的令牌是否与应用程序发出请求的令牌匹配。如果是这样,它将传递该文件。
这样行得通吗?
发布于 2009-11-12 05:42:16
我认为你的建议和我的建议是一致的。
举个例子,看看亚马逊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服务器、操作系统的选择,服务器端代码库的整体效率等。这是一个更大的对话。
希望这能有所帮助!
发布于 2009-11-12 03:39:45
你可以免费提供应用程序,并以应用程序内购买的方式提供视频。您的服务器可以使用一个API来验证IAP收据,以确保客户确实通过Apple合法购买了该商品。
发布于 2009-11-12 03:40:56
您可以始终让iPhone应用程序向服务器发送一个包含其IP地址的请求;然后,在您的服务器上,返回一个仅允许访问该IP的下载的URL。
https://stackoverflow.com/questions/1717547
复制相似问题