0

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

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

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

读取加密的 dll ---to--->> "mystring"

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

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

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


编辑(更多细节):

我想做的事:

我想将一些连接字符串(作为数据表)加密到一个文件中并再次读取这个文件。

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

加密工作流程>

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

解密工作流程

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

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

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

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


编辑:

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

Server    DbName    DbUser    DbPass    FileName

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

4

3 回答 3

4

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

于 2013-04-07T08:33:25.760 回答
1

Surprisingly you can not archieve your goal by using a .NET Assembly.

You could even obfuscate your code and it would still be decompilable and reusable. There's nothing which can prevent that. You can rise the bar, but someone - if she want's - will be able to get the information you are trying to hide.

(Have you seen copy-protection mechanisms that really work besides doing something crucial online?)

Always think of the following: If you want to hide information from a user DO NOT DELIVER that information. Everything else is just protection through obfuscation, wich can be cracked with more or less effort.

于 2013-06-17T18:03:44.817 回答
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 描述的过程。这可以保证您的加密算法安全,但身份验证过程仍然可能被分析和黑客攻击。

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

有一个很好的编码!:)

于 2013-06-17T16:41:56.780 回答