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

时间:2020-03-05 18:45:11  来源:igfitidea点击:

我想将配置文件绑定到我的可执行文件。我想通过在可执行文件中存储文件的MD5哈希来做到这一点。这将阻止可执行文件以外的任何人修改文件。

本质上,如果有人在程序外部修改了该文件,则程序应该无法再次加载它。

编辑:该程序处理信用卡信息,因此能够以任何方式更改配置可能会带来潜在的安全风险。该软件将分发给大量客户端。理想情况下,客户端应具有直接与可执行文件相关联的配置。希望这可以防止黑客将伪造的配置放到位。

尽管仍然需要编辑配置,所以不能为每个客户编译单独的副本。

这是动态的,这一点很重要。这样我就可以在配置更改时将哈希值绑定到配置文件。

解决方案

回答

只需创建一个包含md5哈希值的const字符串并将其编译到应用中即可...应用可以在验证配置文件时仅引用此const字符串

回答

更好的解决方案是将MD5存储在配置文件中。但是MD5不仅仅是配置文件,还包括一些秘密的"键"值,例如固定的guid。

write(MD5(SecretKey + ConfigFileText));

然后,我们只需删除该MD5并重新哈希该文件(包括密钥)即可。如果MD5相同,则没有人对其进行修改。这样可以防止某人修改它并重新应用MD5,因为他们不知道密钥。

请记住,这是一个相对较弱的解决方案(正如我们所建议的那样),因为它们可以轻松地进入程序以查找密钥或者MD5的存储位置。

更好的解决方案是使用公钥系统并签名配置文件。同样,这很弱,因为这将要求将私钥存储在其本地计算机上。可以毫不费力地绕过本地PC上包含的几乎所有内容。

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

更新:我不在乎我们使用的是非对称加密,RSA还是Quantum密码学,如果我们将密钥存储在用户的计算机上(除非必须将其全部通过网络服务进行路由,否则我们必须执行此操作),然后用户才能找到密钥键,即使这意味着在运行时检查CPU上的寄存器!我们只为自己购买了中等级别的安全性,因此请坚持简单的做法。为了防止修改,我建议的解决方案是最好的。为了防止读取,请对其进行加密,如果要在本地存储密钥,请使用AES Rijndael。

更新:可以在安装时生成FixedGUID / SecretKey,并将其存储在注册表中的"秘密"位置。或者,我们可以在每次通过硬件配置使用它时生成它。然后,我们变得越来越复杂。允许进行中等程度的硬件更改的方法是采用6个不同的签名,并分别对配置文件进行6次哈希处理。像上面提到的GUID(全局的或者在安装时生成的)一样,将每个密钥与第二个秘密值结合在一起。然后,当我们检查时,请分别验证每个哈希。只要他们有6分之3(或者承受能力是多少),我们就可以接受。下次编写它时,将使用新的硬件配置对其进行哈希处理。这样,他们就可以随着时间的推移慢慢更换硬件并获得一个全新的系统。 。 。也许这是一个弱点。这一切都取决于宽容度。存在一些基于更严格的公差的变化。

更新:对于信用卡系统,我们可能需要考虑一些实际的安全性。我们应该保留安全和加密顾问的服务。需要交换更多信息。他们需要分析特定需求和风险。

另外,如果我们想使用.NET保证安全,则需要首先使用一个非常好的.NET模糊处理程序(仅使用Google混淆器)就可以了。 .NET程序集是一种易于反汇编并获取源代码并阅读所有秘密的方法。听起来不像是一个破记录,但是从一开始,任何与用户系统安全性有关的东西都存在根本性的缺陷。

回答

出于纯粹的好奇心,如果文件被更改,从不希望加载该文件,这是理由?

为什么不将所有配置信息都保留在可执行文件中?为什么要打扰一个外部文件呢?

编辑

我刚刚读了我们关于这是一个信用卡信息程序的编辑。这构成了一个非常有趣的挑战。

我认为,对于那种安全级别来说,某种相当重要的加密将是必要的,但是我对如何处理这种事情一无所知,即不能仅仅从可执行文件中提取加密秘密。

是否有可能通过某种在线来源进行身份验证?

回答

无论我们将配置文件存储在可执行文件中与否,我建议我们使用非对称密钥加密来加密配置文件。

如果我没记错的话,RSA是变体之一。

有关其说明,请参见Wikipedia上的公钥加密。

将"阅读"键存储在可执行文件中,并保留"书写"键。因此,除了我们可以修改配置之外,没有其他人可以这样做。

它具有以下优点:

  • 除非他们拥有"写入"密钥,否则任何人都无法修改配置,因为任何修改都会完全破坏配置,即使他们知道"读取"密钥也需要花费很多时间才能计算出另一个密钥。
  • 修改保证。
  • 这并不难-这些天有很多可用的库。还有很多密钥生成程序可以生成非常长的密钥。

不过,请对如何正确实施它们进行一些研究。