C# 不使用数据库或.xml文件存储敏感数据的最佳方法

C# 不使用数据库或.xml文件存储敏感数据的最佳方法,c#,xml,security,inno-setup,C#,Xml,Security,Inno Setup,我正在用c#开发一个应用程序,它使用一个.xml文件来获取应用程序逻辑中使用的信息。启动新版本的应用程序时,将创建一个安装程序(使用Inno setup Compiler),并在成功安装安装程序后,将.xml放入应用程序的安装文件中。这个.xml文件包含大约200个对象,每个对象有4个属性,分别是敏感数据。 我被要求启动该应用程序的客户版本,该版本的要求是删除对该.xml文件的访问或操作,因为该文件包含客户无法看到或操作的敏感数据 我的高级工程师告诉我,只需在源代码中的列表中实现信息,这样就可以

我正在用c#开发一个应用程序,它使用一个.xml文件来获取应用程序逻辑中使用的信息。启动新版本的应用程序时,将创建一个安装程序(使用Inno setup Compiler),并在成功安装安装程序后,将.xml放入应用程序的安装文件中。这个.xml文件包含大约200个对象,每个对象有4个属性,分别是敏感数据。

我被要求启动该应用程序的客户版本,该版本的要求是删除对该.xml文件的访问或操作,因为该文件包含客户无法看到或操作的敏感数据

我的高级工程师告诉我,只需在源代码中的列表中实现信息,这样就可以删除.xml文件的使用,客户在安装应用程序后就无法处理这些信息,因为这些信息会隐藏在源代码中,但这对我来说似乎效率很低,我需要改变很多关于在应用程序中使用.xml文件的逻辑,这样才能工作

  • 是否有办法创建应用程序的设置并将此文件隐藏在设置文件中,以便客户无法对其进行操作

  • 如果没有,你能建议我怎么做?还是我别无选择,只能用艰难的方式


  • 如果您想让最终用户更难修改信息,同时仍保留一个不需要更改应用程序本身代码的单独配置文件,则可以对该文件进行签名,并让应用程序验证签名

    最简单的方法是计算文件的哈希值和“secret”值。当然,它很难防篡改。但最终,没有防篡改的方法可以防止用户在自己的计算机上操纵数据。这只是你想让它变得有多难


    更好的方法是使用适当的证书进行签名。应用程序将只知道公钥,并将使用它来验证使用私钥创建的签名,私钥永远不会离开开发团队。

    从理论上讲,如果您的程序能够获得数据,然后,完全控制运行程序的计算机的用户如果足够努力,也可以获得数据。这意味着你可以让他们感到困难,但你不能让它变得不可能。因此,如果这是您试图实现的目标,您需要非常清楚该方法的局限性

    你应该让它变得多困难?好吧,如果这纯粹是一个商业风险,你应该让它变得足够困难,以获取数据的成本大于收益。如果不能以这种方式衡量风险,例如,如果法律要求您保护数据,那么这就不够好了


    在某些情况下,对XML文件进行加密,并将解密密钥深入到用不允许轻松反编译的语言编写的编译程序的逻辑中就足够了。这可能比简单地将XML数据隐藏在编译的程序中要好,这正是您的高级工程师所建议的。但她的建议也可以。将程序逻辑从读取外部文件更改为读取程序中的字符串常量应该不会太困难。

    您想要一种方法来防止具有最高安全许可的人更改自己计算机上的文件吗?可以肯定地说,这只是Windows?撇开玩笑不谈,说服务器-客户端互操作性是不可能的,安全吗?如果是这样的话,我能想到的唯一解决方案就是你同事的建议,完全放弃xml的使用,但即使这样,有技术诀窍的人也可以反编译你的可执行文件……你说的“敏感数据”是什么意思,因为如果你把“敏感数据”放在源代码中,或者把一个文件放在安装文件中。人们总会找到一种容易得到的方法。(反编译代码或只是提取xml)是的,就像@小奥利奥 也就是说,处理敏感数据永远不应该离开您的域。不应该选择隐蔽性安全。此外,给实习生分配没有人愿意透露姓名的任务也不好。如果唯一的目的是防止用户修改数据,那么按照你被告知的方式对其进行硬编码基本上是可以的,因为除非他们修改二进制文件,否则他们将无法修改数据。如果它实际上是用户不能查看的“敏感数据”,那么硬编码是可怕的安全性,对二进制文件进行Authenticode签名就足够了,如果Authenticode验证仍然成功,则进行自检将是一种方法。我的意思是,将数据存储在二进制文件中并进行Authenticode签名,只要没有人从二进制文件中删除Authenticode检查,这将是一种有效的方法。