0

我有一个付费插件的程序,它会经常更新。用户必须购买订阅才能使用某些插件(即每月免费支付)。

我为插件选择基于订阅的模式的主要原因很简单,更新确实是卖点,因为插件必须经常更新。长话短说,这些插件在没有更新的情况下基本上是无用的,因为它所使用的软件也会经常更新,并且出现问题。

现在到文件下载。我基本上只想允许付费用户使用这些插件。

通常使用中央服务器和数据库,这是相当微不足道的,但当您不能拥有带有数据库的中央服务器时,情况并非如此。(我对此没有影响。)

这是我想出的最有效的解决方案:

  • 用户获得一个随机的 AES256 密钥。
  • 我们使用随机的 AES256 密钥加密付费插件。
  • 然后我们用用户密钥加密插件的密钥。
  • 冲洗并对所有用户和插件重复上述操作,并创建一个整体密钥文件。
  • 将加密的插件文件和整体密钥文件上传到文件共享服务。

上述解决方案具有以下特点:

  • 能够在后续版本中撤销密钥。(很重要)
  • 默默无闻没有安全感。任何人都可以下载插件或密钥文件,但除非他们有自己的密钥,否则对他们没有用处,因为暴力破解 AES256 在计算上是不可行的。

这个解决方案没问题,但是当用户和插件数量增加时就会出现问题。

例子:

  • 我们有 10,000 个用户和 100 个插件。
  • 10,000 个用户 * 100 个插件 = 1,000,000 个密钥
  • 1,000,000 个密钥 * 每个密钥 300 字节** = 300MB

** 密钥 (64) + 初始化向量 (32) + 每个密钥的文件格式开销,以便软件可以找到正确的密钥进行解密。

即使在最好的情况下(不可能),它也是一个 96 MB 的密钥文件。

这个(未知)已知问题还有其他解决方案吗?它们叫什么,它们在哪里使用?

4

1 回答 1

1

您正在尝试实施 DRM,尽管本例中的数据是附加组件。除非您控制用户的设备(在很大程度上),否则这是没有解决方案的。

您的问题的直接解决方案是使用单个数据密钥对您的数据进行一次加密。然后,您使用用户密钥加密数据密钥。当然,以这种方式解密数据只需要一个已知密钥,但对于您之前的方案也是如此。

请注意,默认情况下,AES 加密只会增加机密性。机密很容易被破坏。我至少会使用身份验证标签(例如使用 HMAC)添加完整性和真实性。通过这种方式,您可以制定一个相对安全的方案,除非(或者,对于 DRM,直到)您的应用程序的代码被黑客入侵或用户密钥被共享,否则该方案可以正常工作。

于 2014-06-27T11:22:05.100 回答