众所周知,.NET 生成的 dll 很容易被反编译。这意味着敏感信息(例如加密密钥)不应存储在 .NET 二进制文件中。
将敏感数据存储在(例如)我的 .NET 代码可以使用的 C++ 二进制文件中是否是一个明智的选择?我对互操作的东西一无所知,但很好奇这是否是一个值得追求的途径。我想澄清一下,我的问题是:
- 用 C++(或 C)生成的二进制文件可以很容易地反编译以访问敏感的字符串数据吗?
- 这是一个完全轻率的想法,要么是因为它行不通,要么很难实现,还是因为存在我还没有遇到过的更好的替代方案?
众所周知,.NET 生成的 dll 很容易被反编译。这意味着敏感信息(例如加密密钥)不应存储在 .NET 二进制文件中。
将敏感数据存储在(例如)我的 .NET 代码可以使用的 C++ 二进制文件中是否是一个明智的选择?我对互操作的东西一无所知,但很好奇这是否是一个值得追求的途径。我想澄清一下,我的问题是:
答案是不。虽然确实可以将 .NET dll 简单地反编译为其原始结构,而 C/C++ dll 只能被反编译为编译器喜欢的一团糟,但存储在其中的数据将被放置在一个大的、非-mangled,bucket,所以任何知道要查看哪个部分的人(并且,好吧,所有数据都挤在一起,因此很难知道哪个位是哪个位),但数据将在那里供所有人查看。
Google for数据段,这是放置原生 Windows 二进制文件中的静态数据的位置。
快速编辑:当然,您可以将加密信息存储在您的 C++ 二进制文件中,对其进行预加密,但您必须使用其他东西来存储解密密钥(例如您的 Windows 用户密码或类似密码)。.NET 允许您将敏感信息存储在配置文件中,并在首次运行或安装时轻松对其进行加密,这会根据应用程序运行时的用户帐户详细信息对其进行加密和解密(因此不要更改它,并保留在某处复制未加密的配置文件:-))
可以从本机(编译的 c c++ 代码)二进制(exe 或 dll)中读取字符串文字
总有一种方法可以嗅出二进制文件中的敏感信息。.NET 二进制文件和本机二进制文件之间的区别在于它们的反向分析的复杂性(根本原因是 NET 代码运行在进程虚拟机 (VM) 上,因此 .NET 的保护机制几乎没有做超出 VM 的一些技巧)。正如您所提到的,.NET 二进制文件可以很容易地反编译,即使您使用某些混淆器对二进制文件进行了混淆,像de4dot这样的反混淆器也可以轻松地对其进行反混淆。但是本地二进制文件的逆向分析比前者更困难。该领域有很多更有效的保护机制,如反调试、虚拟机混淆等。这些技术可以让你的代码更安全,当然这是相对的事情。
答案是肯定的。敏感数据可以存储在 C++ 编译的二进制文件中。对安全一无所知的人总是这样做。
存在不同程度的安全性,不同的成本和给用户带来的不便。在代码中存储密钥相当普遍,但不是很安全。由于您使用的是暗示 Windows 的 .NET,因此您可能希望查看数据保护 API (DPAPI)。它使用您的 Windows 用户 ID 密码作为密钥来加密数据。
许多笔记本电脑和服务器都包含一个可信平台模块 (TPM) 芯片,该芯片将为您进行加密并为您保护密钥。