有没有办法在Visual Studio中将参考dll转换为非参考dll

时间:2013-04-07 08:15:38

标签: c# visual-studio dll

我的项目中有一个DLL文件(cf.dll)。 它有一些加密和解密字符串To / From文件的方法。

我的“cf.dll”有一些方法:

  

写“mystring”---到 - >>新加密的dll

     

     

读取加密的dll ---到--->> “MyString的”

现在我想发布我的项目,但如果最终用户在他/她的visual studio中使用我的dll(通过引用dll),他/她可以解密我的加密文件。

另一方面,我在我发布的项目中需要这个dll,因为我的项目有时会使用他们的方法。

现在我的问题是: 如何将此已发布的dll(cf.dll)更改为无引用的dll,以防止它被任何黑客攻击。


修改(更多详情):

我想做什么:

我希望将一些连接字符串(作为DataTable)加密到文件并读取此文件。

我有一个用于完成这项工作的dll文件。它是 cf.dll 。它有一些加密和解密的方法。

加密工作流程>

  

DatatTable ------ to ------>> Xml as String - ----通过cf.dll方法------>> enc.dll

解密工作流程

  

enc.dll ------通过cf.dll方法将------>> Xml as String ------ to ------>> DataTable

一切正常,并创建加密文件(enc.dll)。

如果最终用户在visual studio中的新项目中使用我的魔法DLL(cf.dll)(通过引用它),他/她可以解密我的加密文件(enc。 dll)并破解我的程序。

所以,我想通过将我的DLL(cf.dll)更改为无引用DLL 使用其他安全解决方案来防止此黑客攻击。


修改

用于保存连接字符串数据的我的表列:

Server    DbName    DbUser    DbPass    FileName

但是我可以要求通过这种加密机制保存另一个DataTable。所以请通过解决方案来帮助我保存任何字符串,而不仅仅是ConnectionString。 我希望从任何数据中获得非常安全的加密文件。在我的解决方案中,我将每个对象转换为字符串然后使用我的dll方法将其保存为加密文件(我可以做得很好,我的问题如上所述)。

3 个答案:

答案 0 :(得分:4)

您无法将您的dll设为“非参考dll”,但您可以使用“internal”关键字(而非公开)隐藏所有类/方法。这意味着此类/方法只能在当前dll内部或在使用InternalVisibleTo属性指定的DLL / EXE中使用。所以没有人可以直接使用它们,但你应该知道这是托管代码,所以任何人都可以查看你的DLL内部并提取你的密钥进行解密,并编写与你的dll相同的代码。

答案 1 :(得分:1)

这是一个非常好的问题RAM。 解决问题的一些方法:

1)不要制作单独的程序集(DLL),而是将DLL的代码放在EXE中,并使DLL的加密/解密功能“内部”(这样任何人都无法从外部使用它) EXE)。然后使用像Eazfuscator这样的免费工具来混淆你的EXE(因为,如果你不这样做,你的代码将很容易反编译和读取)。

2)您可以将DLL放入EXE的资源中(也许也是加密的)。然后,也许你可以找到一种方法从那里获取它并将其加载到内存中供您的应用程序使用。但是,如果你是初学者,这是非常复杂的事情,而且我不能100%确定它是否可以在.NET中使用(我自己没有这样做)。但是,我认为这是可行的。

3)事实是,如果您的代码在客户端的计算机上执行,那么您无法阻止人们对其进行分析。你能做的最好的事情就是让他们做一点(或很多)困难。例如。您可以在DLL中添加一个锁定机制,要求调用者响应随机问题。如果他正确响应,则执行解密。如果没有,抛出异常,返回null,或者更好的是,返回错误的输出。随机问题可能是您的DLL将在初始化时生成的整数,EXE应该处理此整数以基于某种“秘密”算法生成新的整数。然后,EXE会以某种方式将其“提供”到DLL中,并且它的功能将被“解锁”。

4)也许您可以使用反射来分析调用者程序集,以便找到特征甚至是作者签名(如果您在EXE中放置一个)。这样,如果EXE由您的私钥签名并且签名有效,您可以执行解密。但这也有点复杂。

5)我认为有一些名为“EXE打包程序”的工具可以将EXE和DLL打包成一个EXE文件并在某种程度上保护它们。我还没有用过其中的一个。

6)您可以在要求以复杂方式进行身份验证的网站上移动加密/解密过程,类似于(3)中针对DLL所述的身份。这可能会使您的加密算法安全,但仍然可以分析和破解身份验证过程。

我建议使用第三种解决方案,因为它最容易实现。第4个(使用签名代码)是最安全的,但实现它需要很多知识(即使我现在还没有这些知识)。

有一个很好的编码! :)

答案 2 :(得分:1)

令人惊讶的是,您无法通过使用.NET程序集来实现目标。

你甚至可以混淆你的代码,它仍然可以被分解和重用。 没有什么可以阻止这种情况。你可以提高标准,但有人 - 如果她想要的话 - 将能够获得你想要隐藏的信息。

(你有没有看到除了在网上做一些重要事情之外真正起作用的复制保护机制?)

始终考虑以下事项: 如果要隐藏用户的信息,请不要提供该信息。其他一切都只是通过混淆来保护,可以通过或多或少的努力来破解。

相关问题