保护代码中敏感数据的最佳方法是什么?

net*_*rog 21 .net c# security protection data-protection

我正在研究保护我的代码免受反编译的方法.

这里有几个好的线程描述了混淆和代码打包作为保护代码的可能方法.但是,当使用字符串方法/属性名称时,混淆不适用于反射.许多人不建议使用混淆.

所以我现在决定不再使用上述任何一项.但是,我有部分代码需要加密,例如,带有IP的数据库连接字符串,登录名和密码都存储在代码中const string,与电子邮件帐户数据一样简单.

在ASP.NET中,有一个选项可以将敏感数据移动到.config文件并对其进行加密,但这需要服务器密钥,即链接到单个计算机.我没有读太多关于它,但我想类似的东西可用于桌面应用程序.但我需要这个在任何安装了应用程序的计算机上工作.

这里有一个问题:有没有办法对这些数据进行编码/保护,使其无法与反编译代码一起阅读?

emb*_*oss 17

首先建议不要直接在代码中存储任何敏感内容.无论你多么巧妙地试图对它进行模糊处理,你总是可以对其进行逆向工程.

我已经阅读过诸如将密码分成几个部分,将它们放在代码中的不同位置并在最终使用它们之前通过一系列函数运行它们之类的东西......虽然这会使事情变得更难,但您仍然可以始终监视应用程序使用调试器,最终您将能够检索秘密信息.

如果我正确地解释了您的场景,那么您所拥有的代码是在某个客户端部署的代码,并且您的代码连接到数据库(我想这也是在客户端的监督下),连接到它需要密码.该密码对于该客户端是已知的,因此尝试将其从客户端隐藏起来是相当无用的.什么,你希望是限制访问来自任何人说密码谁不应该知道这一点.

您通常通过将敏感信息放在应具有非常严格权限的文件夹中的单独文件中来实现此目的,只有应用程序和少数选定人员才能访问.然后,应用程序将在运行时根据需要访问信息.

此外加密单独的文件原来是一个问题 - 如果你这样做,所以那时就涉及这再次将不得不以某种方式保护的关键 - 无限递归是它的方式:)安全访问文件往往是足够了,但如果你真的需要尽可能安全,那么解决方案就是对文件使用基于密码的加密.但这里的想法不是将密码存储在系统的另一个位置,而是存储带外信息(例如在物理保险库中)并在启动应用程序时输入密码.这也存在问题:(重新)启动应用程序需要物理存在人员,您仍然可以从运行应用程序的机器的RAM中检索密码.但如果没有专门的硬件,它可能是最好的.

基于密码的加密的另一个好的替代方案是依赖于特定于操作系统的"密码保险库",例如Windows的" 隔离存储",在完全不加密和保持密码带外之间需要进行权衡.


Pad*_*ddy 11

这不是加密答案,但"安全"的一种方法是通过Web服务进行所有数据库调用.然后,您的连接凭据将存储在您的安全服务器上,客户端会通过该服务器传递所有呼叫.

没有任何敏感存储在你的可重新分配中......


Blu*_*kMN 5

我过去一直在努力解决这个问题,并提出了三种处理问题的方法,但我不确定它们是否完美:

  1. 对值进行模糊处理或加密,并希望获得最佳效果.当然,加密只是一个额外的混淆程度,因为密钥必须与其余部分一起提供.
  2. 通过使用单向加密来消除对密钥本身的需求.使用私钥生成公钥.这可用于许可或密码验证.您使用私钥生成许可证,但可以使用公钥来验证它们.或者您使用私钥生成可以验证的密码,但不能使用公钥进行反转.
  3. 创建您自己的系统特定的密钥生成机制,类似于ASP.NET使用的机制.您可以通过为每个安装或站点生成唯一键来限制在步骤1中反转加密/混淆的人员的影响.

  • 请参阅http://stackoverflow.com/questions/2742583/modify-emdeded-string-in-c-sharp-compiled-exe (2认同)