众所周知,.NET生成的dll可以很容易地反编译。这意味着敏感信息(例如加密密钥)不应存储在.NET二进制文件中。
在(例如)可能被我的.NET代码使用的C ++二进制文件中存储敏感数据是否是一种明智的替代方法?我还不知道互操作的东西,但我很好奇这是否是一个值得追求的途径。我想澄清一下,我的问题是:
答案 0 :(得分:12)
答案是否定的。虽然它真正的.NET dll可以简单地反编译为其原始结构,并且C / C ++ dll只能被反编译成编译器会喜欢的怪物混乱,存储在那里的数据将放在一个大的,un - 所以任何知道要查看哪个部分的人(并且,好的,所有数据都塞满了彼此,因此很难知道哪个位是哪个),但数据将在那里供所有人查看。
Google for data segment,这是本机Windows二进制文件中静态数据的放置位置。
快速编辑:当然,您可以将加密信息存储在C ++二进制文件中,对其进行预加密,但您必须使用其他内容来存储解密密钥(例如,您的Windows用户密码或类似密码)。 .NET允许您将敏感信息存储在配置文件中,并在首次运行或安装this encrypts时轻松加密,并根据应用程序运行的用户帐户详细信息对其进行解密(因此请勿更改,并在某处保留未加密的配置文件的副本:-))
答案 1 :(得分:4)
字符串文字可以从本机(c c ++代码编译)二进制(exe或dll)
中读取答案 2 :(得分:3)
总有一种方法可以嗅出二进制文件中的敏感信息。 .NET二进制文件和本机二进制文件之间的区别在于其反向分析的复杂性(根本原因是.NET代码在进程虚拟机(VM)上运行,因此.NET的保护机制几乎不会在VM之外做一些技巧)。正如您所提到的,.NET二进制文件可以很容易地被反编译,甚至您可以通过某些混淆器对您的二进制文件进行模糊处理,例如de4dot之类的反混淆器可以轻松地对其进行反混淆处理。但是对原生二进制文件的反向分析比前者更难。该领域有更多有效的保护机制,如反调试,虚拟机混淆等。这些技术可以使您的代码更安全,当然这是一个相对的东西。
答案 3 :(得分:1)
答案是肯定的。敏感数据可以存储在C ++编译的二进制文件中。对安全一无所知的人会一直这样做。
答案 4 :(得分:1)
存在各种程度的安全性,不同的成本和对用户的不便。在代码中存储密钥是相当常见的,但不是很安全。由于您使用的是暗示Windows的.NET,因此您可能需要查看数据保护API(DPAPI)。它使用您的Windows用户ID密码作为密钥加密数据。
许多笔记本电脑和服务器都包含一个可信平台模块(TPM)芯片,可以为您进行加密并为您保护密钥。