2010-09-17 89 views
4

这个问题似乎已经死了,所以我决定提供赏金。如何保护我客户的客户的.net winforms程序集

我最感兴趣的是知道如果我在下面的ETA1中的​​场景是可行的并且被使用。如果不是,那么很好的解释为什么不会是一个好的答案。另一个好的答案将是一个替代方案(但不包括internalsvisibleto属性)。

最好的答案是,是的,它是可行的,每个人都这样做,客户喜欢它! ETA2:我想我已经想到了一个很好的解决方案。我向客户提供一个可分发版本,其版本与其版本一样实用,但未经许可且使用属性隐藏类别和成员。 我可以用编译器指令在每一个重要的成员上做到这一点,但我想知道是否有一些全局的方法来隐藏一个类的所有成员?


简化的情景: -
我有一个以某种方式延伸的控制一类,我想卖下的两个牌照我的课;

(1)标准 - 客户获得x个使用我的类的控件,但无法实例化类(其内部)。
(2)开发人员 - 除了可以使用我的课程创建自己的控件外,其他与标准课程相同。

我的问题是,当开发者客户出售他们的控件时,他们不得不让我的课程暴露给他们的所有客户。

---忽略这个 在我的头脑中,围绕它的唯一方法是让开发者以某种方式将我的程序集合到他们的程序中,并且这样我就可以将构造函数保持在内部。或者,使用内部可见的属性。 /忽略此---

我敢肯定这里有人有相同的情况,任何帮助将不胜感激。 ETA1:我在这里大声思考,但是,我可以有一个客户可以添加的允许调用程序集名称列表。当他们运送他们的产品时,他们客户的组件将不在列表中,因此他们将无法实例化某些类。 (该列表显然可以被哈希)。

+0

我不确定这是您寻找的内容,但SecureTeam CLICesure允许您保护您的代码以及添加许可功能 – TimothyP 2010-10-02 21:39:30

回答

1

我相信你已经想出了唯一真正的解决方案,假设运行时会支持它。只要你的是一个单独的DLL,如果开发者可以实例化你的对象,那么其他任何人都可以,无论你试图将它隐藏在构造函数,工厂等等之后。

不过,我想知道,消费者是否可能无法通过将发货组件集成到自己的限制中来避开这种限制?

+0

总是有解决方法,比如使用反射,但我想显示我至少做了一个努力。 – Jules 2010-09-17 20:56:40

0

这是一个艰难的,只是由于.NET的本质。这是在黑暗中拍摄的,但您可以查看诸如CodeVeil之类的产品,该产品可在IL级别提供汇编加密。您的组装本质上将被加密运输,并且钥匙将交给您的客户。客户将是唯一能够解密装配说明的实体。现在,CodeVeil对其解密密钥声明如下:

即使密钥存储在不会造成不安全的应用程序中。事实上,密钥本身并不像数据本身的转换那么重要。 CodeVeil还使用许多运行时保护操作来阻止黑客试图捕获解密的程序集。此外,CodeVeil使用一个非常特殊的解密系统,它仅解密.NET运行时的足够信息以执行该特定方法。代码永远不会与程序集本身存储在同一内存中,因此解密后的代码不能转储到磁盘进行分析。

这显然是一件好事,但这是你必须研究的部分,因为我不熟悉他们用作解密算法一部分的其他技术。这很酷的事情是,如果它起作用,你的客户会很开心,他们可以通过他们自己的API暴露你的程序集的一部分,从而使他们的客户开心。同时,您的代码不受ILDASM和Reflector等工具的影响。

2

我相信你会在注册表中的某处存储许可信息(即标准和开发人员)。在这种情况下,我想更简单的解决方案是实施LicenseManager。这是大多数.NET组件供应商使用的。

http://msdn.microsoft.com/en-us/library/fe8b1eh9.aspx

希望这有助于!

1

为什么不使用许可证密钥?你的班级读取许可证密钥,并根据许可证提供的许可权限,在运行时禁用方法?

许可证密钥可以在配置文件中定义。