C# 如何在.Net中的可执行文件中存储信息

C# 如何在.Net中的可执行文件中存储信息,c#,.net,C#,.net,我想将配置文件绑定到可执行文件。我想通过在可执行文件中存储文件的MD5散列来实现这一点。这将防止除可执行文件之外的任何人修改文件 基本上,如果有人在程序之外修改此文件,程序将无法再次加载它 编辑:该程序处理信用卡信息,因此能够以任何方式更改配置可能存在潜在的安全风险。此软件将分发给大量客户端。理想情况下,客户端应该有一个直接绑定到可执行文件的配置。这将有希望防止黑客能够得到一个虚假的配置到位 配置仍然需要可编辑,尽管如此,为每个客户编译一个单独的副本不是一个选项 这是很重要的,这是动态的。这样

我想将配置文件绑定到可执行文件。我想通过在可执行文件中存储文件的MD5散列来实现这一点。这将防止除可执行文件之外的任何人修改文件

基本上,如果有人在程序之外修改此文件,程序将无法再次加载它

编辑:该程序处理信用卡信息,因此能够以任何方式更改配置可能存在潜在的安全风险。此软件将分发给大量客户端。理想情况下,客户端应该有一个直接绑定到可执行文件的配置。这将有希望防止黑客能够得到一个虚假的配置到位

配置仍然需要可编辑,尽管如此,为每个客户编译一个单独的副本不是一个选项



这是很重要的,这是动态的。这样我就可以在配置更改时将散列绑定到配置文件。

只需创建一个常量字符串来保存md5散列,并将其编译到您的应用程序中。。。然后,当验证配置文件时,您的应用程序可以只引用此常量字符串。更好的解决方案是将MD5存储在配置文件中。但是,与MD5只是配置文件的一部分不同,MD5中还包括一些秘密的“密钥”值,如固定的guid

write(MD5(SecretKey + ConfigFileText));
然后,您只需删除MD5并重新刷新文件(包括您的密钥)。如果MD5相同,则没有人修改它。这可以防止有人修改它并重新应用MD5,因为他们不知道您的密钥

请记住,这是一个相当弱的解决方案(正如您建议的那样),因为他们可以很容易地跟踪到您的程序中,以找到密钥或MD5的存储位置

更好的解决方案是使用公钥系统并对配置文件进行签名。这一点也很弱,因为这需要将私钥存储在本地机器上。只要付出足够的努力,几乎可以绕过本地PC上包含的任何内容

如果您真的想将信息存储在可执行文件中(我不鼓励这样做),那么您可以尝试将其附加到可执行文件的末尾。这通常是安全的。修改可执行程序是一种类似病毒的行为,大多数操作系统安全也会试图阻止你。如果您的程序位于program Files目录下,配置文件位于Application Data目录下,并且用户以非管理员身份登录(在XP或Vista中),则您将无法更新EXE

更新:我不在乎您是否使用非对称加密、RSA或量子加密,如果您将密钥存储在用户的计算机上(除非您通过web服务将其全部路由),则用户可以找到您的密钥,即使这意味着在运行时检查CPU上的寄存器!你只是给自己买了一个中等程度的安全感,所以坚持简单的东西。为了防止修改,我建议的解决方案是最好的。要防止读取,请对其进行加密,如果您在本地存储密钥,请使用AES Rijndael

更新:也可以在安装时生成FixedGUID/SecretKey,并将其存储在注册表中的“机密”位置。或者,您可以在每次使用它时从硬件配置生成它。那你就变得更复杂了。您希望如何做到这一点,以允许适度的硬件更改,将采取6个不同的签名,并散列您的配置文件6次-每次一次。将每个值与第二个秘密值组合,如上面提到的GUID(全局或在安装时生成)。然后,当您检查时,您将分别验证每个散列。只要他们有六分之三(或者你的容忍度是多少),你就接受。下次编写时,使用新的硬件配置对其进行散列。这使得他们可以慢慢地更换硬件,得到一个全新的系统。也许这是一个弱点。这一切都取决于你的宽容。基于更严格的公差,存在一些变化

<强>更新:< /强>对于信用卡系统,您可能需要考虑一些真正的安全性。您应该保留安全和加密顾问的服务。需要交换更多的信息。他们需要分析您的具体需求和风险


此外,如果您想要.NET的安全性,您需要首先从一个非常好的.NET混淆器()开始。NET程序集是一种易于反汇编、获取源代码和阅读所有机密的方法。听起来不像是一张破唱片,但任何依赖于用户系统安全性的东西从一开始就存在根本缺陷

纯粹出于好奇,如果文件被更改,你为什么不想加载它

为什么不在可执行文件中编译所有配置信息?为什么还要麻烦使用外部文件呢

编辑

我刚读到你的编辑,说这是一个信用卡信息程序。这是一个非常有趣的挑战

我认为,为了达到这样的安全级别,某种相当重要的加密是必要的,但我不知道如何处理这种事情,使加密秘密不能仅仅从可执行文件中提取


是否可以针对某种在线源进行身份验证?

我建议您使用非对称密钥加密来加密配置文件,无论它们存储在可执行文件中还是不存储在可执行文件中

如果我没记错的话,RSA就是其中一个变种

有关解释,请参见维基百科上的

将“读取”键存储在可执行文件中,并将“写入”键保留在自己的位置。因此,只有您可以修改配置

这具有以下优点: