使用程序集作为许可证文件的优点/缺点?

时间:2010-01-27 21:55:19

标签: c# .net reflection assemblies

我最初打算使用签名的序列化xml文件来存储许可证详细信息。 在规划中,越来越多的人进入了这个“许可证文件”,这将允许我们通过提供的许可证文件分发单个应用程序并控制可用的功能。

用户界面和打印的报告与经销商徽标共同标记,因此如果将其嵌入到许可证中将会很好。我知道这可以用序列化的xml文件完成,但我想知道在编译的程序集中存储这些数据的优点和缺点是什么?

许可证生成工具可以使用适当的属性和资源编译程序集并对其进行签名。

更新
从我所看到的,使用序列化的xml或程序集将非常相似。从我的角度来看,程序集将允许我添加其他资源并为将来留下一些灵活性。一旦资源变得复杂,xml序列化就很麻烦。

UPDATE2
该软件仅适用于我们的硬件,因此许可证安全性不是一个大问题。主要目的是阻止临时用户启用他们尚未支付的功能。我会选择一个而不是设计简单!

6 个答案:

答案 0 :(得分:6)

签名的xml许可证文件几乎没有什么优势,但它们可能不适用于您的情况:

  1. 您可以使用记事本或网络浏览器等简单工具检查内容。如果您需要管理大量许可证并且花费大量时间,则只需查看文件即可更轻松地检查许可证范围。甚至客户也可以通过电话向您朗读他的许可证中最重要的一点。
  2. 如果单个应用程序安装可以分配许多许可证(按用户,按功能等),则管理xml文件列表比动态加载程序集更容易。
  3. 为客户端许可证创建创建工具更容易 - >应用程序将提交一个未签名的xml文件进行签名。
  4. 版本控制更容易。如果您的软件的新版本具有新的许可选项,并且旧许可证应与升级版本一起使用,则根据您对已签署的许可程序集的实施,您可以破坏旧软件。
  5. 如果您没有任何这些特定需求,请使用assembly-as-a-license选项,因为它更容易实现。

    <强>更新

    查看我之后出现的其他答案 - 对本地计算机上运行的软件的完美保护不存在,很可能在很长一段时间内不存在。不要花太多时间来保护你的软件,因为如果有人真的想要免费使用它,他会找到一种方法。为用户提供更多使用您的应用程序的理由并简化购买体验。

    在dll或外部xml文件中签署许可证就足够了。

答案 1 :(得分:4)

您可以使用程序集代替许可证文件,但不应该。始终可以从装配中删除数字签名;现在使用Reflexil工具很简单。

有关详细信息,请参阅文章CAS Tamper-Proofing is Broken: Consequences for Software Licensing

答案 2 :(得分:3)

一直对我有用的好解决方案是创建一个包含所需属性的许可类,例如名称,过期,徽标等。将类序列化为内存中的二进制数据,然后加密并保存到文件中。这样做不需要签名,文件也是防黑客的。要阅读您的许可证,只需反过来,阅读文件,解密,反序列化。有一点需要注意的是,如果多个程序集要读取此许可证文件,则encrypt / unncrypt函数应位于单独的共享程序集中。

答案 3 :(得分:1)

我不会将程序集用作许可文件 - 正如其他人指出的那样,打破它是相对微不足道的。
我会使用一个文件(xml或其他)然后将其锁定到用户计算机。这可以通过几种方式实现:
1)使用System.Cryptography.ProtectedData - 这只包装Windows DPAPI并使用Windows密钥存储(每个用户或每个本地计算机)。这是一种简单的(ish)方法,但您必须使用Encoding.UTF8.GetString(或任何编码)从字节数组转换回来。这很简单但不是工业强度,因为有人仍然可以挖出钥匙店等 2)使用机器唯一ID(例如SID)和对称算法(如Rijndael或Blowfish),并提供未加密许可证文件的SHA-256哈希值作为IV。实现起来有点复杂,因为您需要使用WMI查找SID,然后使用System.Security.Cryptography.RijndaelManaged等进行加密/解密。

答案 4 :(得分:0)

我更喜欢汇编版本,因为:

  • 您可以使用authenticode(您需要一个证书,但它不是expensive),而不是.net符号,或者您可以使用两者。在您的应用程序中,您可以检查签名。这将删除篡改的.net标志的安全漏洞。
  • 它更灵活。您可以为许可证程序集定义一个可以稍后扩展的界面。
  • 您可以在许可证程序集中使用某些逻辑。

但请记住。这只是一个软件保护。下一步是使用加密密钥(haspmarx ...)

答案 5 :(得分:0)

我认为使用该程序集很有创意,但更容易进行逆向工程。使用反射器打开应用程序后,检查许可证的所有位置都可识别为许可证类上的属性读取。我看到的另一个问题是版本控制。当2.0版本出现时,您的营销团队可能会要求您接受1.0许可证。您的2.0软件可能有一个新的许可证类,其中包含额外的属性,这些属性不再与1.0版本的类本互换。当然,您可以为此制定解决方法,但它会破坏原始设计的简单性。