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

本文关键字:方式反 编译 方式 一样 c++ 隐藏 安全 exe 加密 任何 一种 | 更新日期: 2023-09-27 18:05:46

我喜欢c#编程应用程序(我认为自己是c#的中级,c/c++的稍微少一点,但只是学习,在舞台上还没有真正的东西),我曾经喜欢它,直到我发现"任何人"理解MSIL(也不是一件容易学习的任务)可以反编译我的代码。我并不真正关心有人对我的代码进行反编译,但我最关心的是我的最终程序用户的安全性。我知道存在混淆器,我甚至听说有一两个非常好的混淆器(即使它们只是延迟反编译)。

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

我的意思是,大多数用户都不知道用什么语言来制作这个exe,但是有一群人可以用c#编程,其中的精英可以读MSIL,而这些精英中的一小部分人愿意破解任何可能破解的东西。在那些喜欢黑客的人中,他们中的一些人可能有不正当的意图(在我们生活的一个没有价值的世界里,这不会让任何人感到惊讶)。

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

在Java中会发生吗?(Java具有与c#相同的"解释"answers"反编译"结构);我的意思是,事实上,关键是可见的Java(与一些受过教育的眼睛)在某些地方的建筑文件?或者Java是否使用了一些基于C/c++的API,使得反编译密钥所在的文件变得更加困难(困难得多),因此很难获得密钥?

是我用c/c++写程序的唯一选择吗?因为如果是这样,我唯一的选择是c++ Builder,因为它是一个地狱甚至试图观看(更少学习)MFC/OWL代码;我的意思是:我很难想象有人会喜欢MFC/OWL编程。事实上,我认为汇编语言在当今的编程世界中更有吸引力。

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

如果有人知道一个网站,在那里我可以找到精确的信息关于微妙的推理,我想我已经做了(特别是一个显示我的分析是错误的),请告诉我。如果有人能证实我的分析,请确认。如果有人在我的分析中发现任何漏洞,请再次告诉我,以及在哪里可以找到更多的信息,让我更好地理解这一切。

很抱歉把这个哲学的计算机编程问题讲得那么长。

谢谢你,

McNaddy

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

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

。你不能在任何语言中这样做。

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

加密的目的是利用一些私钥的保密性来保护文本的保密性。如果这不是您面临的安全问题,那么加密是错误的工具。说明你实际遇到的安全问题,这里有人可以帮助你解决。

所以,如果我想编写一个程序从互联网上下载一个文件,即使我使用OpenSSL和c#,也可能有人干扰传输并做一些邪恶的事情,因为c#文件中的某个地方是密钥。

你不需要仅仅为了安全下载文件而在程序中存储密钥。

如果您想要确保您下载的文件是真实的,并且在传输过程中没有被修改,您可以使用数字签名。用于签名的私钥不必(也不应该)随程序分发;程序所需要的只是相应的公钥,您不必隐藏它。

如果你想防止窃听者在下载文件时读取文件,那么你需要加密它,但这可以通过每次下载随机生成的临时会话密钥来完成;它不需要存储在任何地方。如果您使用HTTPS下载,它会为您做这些。

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

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

不应该在程序集中存储加密密钥;它们通常应该从外部提供,例如从密钥存储库,或从用户已知的秘密派生。

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

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

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

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