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

标签 c# .net security protection data-protection

我正在研究保护我的代码不被反编译的方法。

这里有几个很好的线程描述混淆和代码打包作为保护代码的可能方法。然而,它们都不是理想的,当使用字符串方法/属性名称时,混淆不适用于反射。许多人根本不建议使用混淆。

所以我目前决定不采用上述任何一种。 但是我有部分代码需要某种加密,例如,带有 IP、登录名和密码的数据库连接字符串存储在代码中简单的 const string,与电子邮件帐户数据相同。

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

问题是:有没有办法对此类数据进行编码/保护,使其无法与反编译代码一起读取?

最佳答案

第一个建议是永远不要直接在您的代码中存储任何敏感内容。您可以始终对其进行逆向工程,无论您试图对其进行多么巧妙的混淆。

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

如果我正确地解释了您的场景,那么您所拥有的是要部署在某些客户场所的代码,并且您的代码已连接到数据库(我想这也在客户的监督下),连接到它需要密码.该密码为该客户端所知,因此试图对客户端隐藏它是毫无用处的。您想要的是限制任何不应知道该密码的人访问该密码。

您通常通过将敏感信息放在一个文件夹中的单独文件中来实现这一点,该文件夹应该具有非常严格的权限,只有应用程序和少数选定的人才能访问。然后,应用程序将在运行时需要时访问这些信息。

另外加密单独的文件被证明是一个问题 - 如果你这样做那么就会涉及一个 key ,必须以某种方式再次保护它 - 无限递归正在进行中:) 保护对文件的访问通常就足够了,但如果您确实需要尽可能安全,那么解决方案是对文件使用基于密码的加密。但这里的想法不是将密码存储在系统的另一个位置,而是作为带外信息(例如在物理保险库中)并在启动应用程序时输入密码。这也有它的问题:(重新)启动应用程序需要一个人的实际存在,并且您仍然可以从运行应用程序的机器的 RAM 中检索密码。但这可能是您在没有专用硬件的情况下所能做的最好的事情。

基于密码的加密的另一个很好的替代方法是依赖操作系统特定的“密码库”,例如 Windows 的 Isolated Storage ,这是在根本不加密和将密码保留在带外之间的一种权衡。

关于c# - 保护代码中敏感数据的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7849620/

相关文章:

javascript - 如何保护 Backbone.js

VBA密码保护: how it works?安全吗?有其他选择吗?

java - 如何在不同的程序中使用相同的 IvParameterSpec 对象?

c# - 预购通用列表 C#

.net - 基于公共(public)接口(interface)的Windsor组件注册

c# - 如何在 c# 中为 mysql 处理空日期而不将它们转换为空

.net - 如何制作自定义 WPF 集合?

.net - Microsoft GraphEngine LIKQ 查询

c# - 通过反射从动态中检索属性信息

c# - dSYM 文件夹和 mSYM 文件夹有什么区别?