将敏感数据存储在C ++编译的二进制文件中是否安全?

时间:2012-12-28 13:05:40

标签: c++ .net security decompiling binaries

众所周知,.NET生成的dll可以很容易地反编译。这意味着敏感信息(例如加密密钥)不应存储在.NET二进制文件中。

在(例如)可能被我的.NET代码使用的C ++二进制文件中存储敏感数据是否是一种明智的替代方法?我还不知道互操作的东西,但我很好奇这是否是一个值得追求的途径。我想澄清一下,我的问题是:

  1. C ++(或C)中生成的二进制文件是否可以轻松反编译以访问敏感的字符串数据?
  2. 这是一个完全没有思想的想法,要么是因为它不起作用,要么很难完成,要么是因为我还没有遇到过更好的替代方案呢?

5 个答案:

答案 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)芯片,可以为您进行加密并为您保护密钥。