我可以安全地隐藏c#exe的加密密钥(以一种不能以任何已知方式反编译的方式),就像在C / C ++中一样?

时间:2011-08-16 02:45:51

标签: c# security encryption decompiling

我喜欢c#用于编程应用程序(我认为自己用c#中间,用C / C ++稍微少一些,但我只是在学习,在竞技场中没有什么真实的东西),我以前喜欢它,直到我发现“任何人“谁理解MSIL(不是一个容易学习的任务)可以反编译我的代码。我真的不关心有人反编译我的代码,但我最关心的是我最终程序用户的安全性。我知道混淆器存在,我甚至知道一两个非常好,我听说(即使它们只是延迟反编译)。

例如,如果我想使用c#解密某些内容,那么密钥应该在代码中的某些位置,对于使用我的程序的任何人来说都是危险的(知道有人使用我的程序加密文件的人可以解密它通过研究我的MSIL代码,找到我的密钥)。然后,由于这个原因,开发用于加密/解密内容(或OpenSSL)的大量应用程序对c#来说是疯了,我认为。

我的意思是,大多数用户不会知道使用什么语言来制作该exe,但是很多人都可以编写nc#,这个人的精英可以阅读MSIL,而这些精英中的少数人会喜欢黑客攻击什么是可能的。在那些喜欢破解的人中,有些人可以用不正当的意图做到这一点(在我们生活的无价值的世界中,不应该让任何人感到惊讶)。

所以,如果我想制作一个从互联网上下载文件的程序,有人可能会干扰传输并做一些恶事,即使我使用带有c#的OpenSSL,因为c#文件中的某个地方是关键。我知道避免黑客攻击可能是不可能的,但看起来c#是一种非常不安全的方式。

Java会发生吗? (Java与C#具有相同的“解释”和“反编译”结构);我的意思是,密钥在Java中可见(有一些受过教育的眼睛)在构建文件中的某些位置?或者Java是否使用了一些基于C / C ++的API,这使得对密钥进行反编译的文件变得更难(更难),从而难以获得密钥?

我是用c / c ++编写程序的唯一选择吗?因为如果是这样的话,我唯一的选择就是C ++ Builder,因为它甚至可以尝试观察(并且更少学习)MFC / OWL代码;我的意思是:我几乎无法想到有人喜欢MFC / OWL编程。事实上,我认为大会可能对今天的编程世界更感兴趣。

所以,在这里,我想找到一个可以更好地解释我的方法来安全加密密钥以加密/解密或使用OpenSSL和c#。甚至是Java。我想确认C / C ++是真正使用这些功能的唯一方法,其中一些安全性用于反编译原因(如其他编译编程语言,即Delphi)。

如果有人知道某个网站,我可以找到有关我所做的微妙推理的精确信息(特别是我的分析中显示错误的信息),请告诉我。如果有人能确认我的分析,请确认。如果有人在我的分析中找到任何漏洞,请再次告诉我,以及在哪里可以找到更多信息来统治我以更好地理解这一切。

很抱歉这个哲学计算机编程问题很长。

谢谢,

McNaddy

5 个答案:

答案 0 :(得分:16)

  

我可以安全地隐藏c#exe的加密密钥(以一种无法以任何已知方式反编译的方式),如在C / C ++中那样?

没有。你不能用任何语言做到这一点。

.NET安全系统旨在保护良性用户免受恶意代码的攻击。您正试图保护恶意用户中的良性代码。你根本做不到,所以不要尝试。如果你有秘密,不要与任何人分享。

加密的目的是利用某些私钥的保密性进入文本的保密性。如果这不是您面临的安全问题,加密是错误的工具。 解释您实际拥有的安全问题,此处有人可以帮助您解决问题。

答案 1 :(得分:4)

  

所以,如果我想制作一个从互联网上下载文件的程序,有人可能会干扰传输并做一些恶事,即使我使用带有c#的OpenSSL,因为c#文件中的某个地方是关键。

为了安全下载文件,您无需在程序中存储密钥。

如果您想确保下载的文件是可信的并且在传输过程中未经过修改,请使用digital signature。用于签名的私钥不必(也不应该)与程序一起分发;所有程序需求都是相应的public key,您无需隐藏。

如果您想要防止窃听者在下载文件时读取文件,那么您需要对其进行加密,但这可以通过为每次下载随机生成的临时session key来完成;它不必存储在任何地方。如果您使用HTTPS进行下载,它将为您执行此操作。

答案 2 :(得分:1)

你提到的选择(将密钥嵌入可执行文件)是不好的,无论你选择哪种语言 - 从C / C ++中提取数据并且对C#/ Java稍微容易一点也不难。

正如Jordão所说 - 你需要弄清楚你在二进制文件之外分发密钥的故事。您还需要弄清楚您实际想要保护的内容并了解可能的漏洞。仅在应用程序中使用某种加密并不会使其更安全。

答案 3 :(得分:0)

您不应将加密密钥存储在程序集中;它们通常应该从外面提供,例如来自密钥库,或者来自用户已知的秘密。

答案 4 :(得分:0)

您还可以从密码生成密钥(这意味着密钥不会比密码更强)。因此,每次用户运行程序时,系统都会提示他们输入密码,然后使用该密码生成密钥。根据您的要求,您可以通过各种方式使用它。

当用户需要访问加密数据时,可以再次提供密码,这将生成在该会话期间使用的密钥。一旦程序关闭,密钥就会被丢弃(C#中有技术/ API,以帮助确保敏感数据只在尽可能短的时间内存在于内存中)。

例如,这基本上是许多密码存储程序,如Keepass或Roboform。用户可以上传和下载加密数据到服务器和从服务器下载。没有密钥存储,而是在用户提供该会话的密码时按需生成。

使用像Dropbox这样的服务,当您注册其网站时,他们会在其服务器上生成私钥并在那里保留副本。因此,用户的计算机和客户端软件从不存储密钥,但服务器存储了副本。 Dropbox执行此操作,以便他们可以出于多种目的解密用户数据,例如压缩,重复数据删除,遵守执法等。