我有一个付费的插件程序,它经常更新。用户将不得不购买订阅才能使用某些插件(即每月支付免费)。
我选择基于订阅模式的插件的主要原因很简单,更新是真正的卖点,因为插件必须经常更新。长话短说,如果没有更新,这些插件基本上是无用的,因为它所使用的软件也经常更新,而的东西将喙。
现在开始下载文件。我想基本上只允许付费用户使用这些插件。
通常对于一个中央服务器和数据库来说,这是相当微不足道的,但是当你不能有一个带有数据库的中央服务器时,就不是这样了。(我对这个没有影响)
这是我想到的最有效的解决方案:
- 用户获得一个随机的AES256密钥。 我们使用随机的AES256密钥加密付费插件。然后我们用用户密钥加密插件的密钥。
- 对所有用户和插件重复上述操作,并创建一个单一的密钥文件。
- 上传加密的插件文件和单片密钥文件到文件共享服务
以上方案具有以下特点:
- 在后续版本中撤销密钥的能力。(非常重要)
- 没有隐藏安全性。任何人都可以下载插件或密钥文件,但它对他们没有用处,除非他们有自己的密钥,因为暴力破解AES256在计算上是不可行的。
这个解决方案是正确的,但是当用户和插件数量增加时,问题就开始出现了。
例子:
- 我们有10000个用户和100个插件。
- 10000个用户* 100个插件= 1,000,000个密钥
- 1,000,000个密钥*每个密钥300字节** = 300MB
**密钥(64)+初始化向量(32)+每个密钥的文件格式开销,以便软件可以找到正确的密钥进行解密。
即使在最好的情况下(不可能),它也将是一个96 MB的密钥文件。
对于这个(未知)问题还有其他解决方案吗?它们叫什么,在哪里使用?
您正在尝试实现DRM,尽管本例中的数据是附加组件。这是没有解决方案的,除非你控制用户的设备(很大程度上)。
你的问题的直接解决方案是使用单个数据密钥加密你的数据一次。然后使用用户密钥加密数据密钥。当然,这种方式只需要一个已知的密钥来解密数据,但对于您之前的方案也是如此。
注意,默认情况下,AES加密只增加机密性。保密很容易被打破。我至少会使用身份验证标签(例如使用HMAC)添加完整性和真实性。通过这种方式,您可以制定一个相对安全的方案,除非(或者,对于DRM,直到)您的应用程序的代码被黑客攻击或用户密钥被共享。