【问题标题】:Is c# published win form application source code readable by others?c#发布winform应用程序源代码别人可读吗?
【发布时间】:2021-01-03 06:30:30
【问题描述】:

我在 C#(Windows 窗体应用程序)中做了一个项目,代码中有一些常量变量保存重要信息,例如数据库密码等。基本上我的问题是,当我“发布”我的项目并提供安装文件夹供某人在他的计算机上安装应用程序时,他是否可以阅读我的源代码?

【问题讨论】:

  • 是的。简而言之:保护数据的唯一方法是对其进行加密。但使​​用的唯一方法是解密它。如果计算机可以读取某些内容,那么用户也可以。和提示:不要硬编码凭据。使用配置文件。
  • 不是源代码本身,而是使用像 dotPeek (jetbrains.com/decompiler) 这样的反编译器可以获得非常接近的源代码版本。密码等将是可见的。
  • 较新的 Visual Studio 使用 Ilspy,结果相似(Visual Studio 2019 附带对 F12 的反编译支持。要启用,请转到工具/选项/文本编辑器/C#/高级并选中“启用导航到反编译源")
  • 是的。对于任何用 .NET(c#、VB.NET)编写的应用程序,任何有权访问 DLL 的人都可以使用 dotPeek 或 JustDecompile 对它们进行反编译。局部变量的名称会有所不同,但字段、方法、类的名称会像源代码一样被反编译。
  • 根据this link ClickOnce 设置是存储连接字符串的推荐方式。但我无法确定用户是否无法访问这些...

标签: c#


【解决方案1】:

有许多反编译器可用于显示源代码,例如

Jetbrains 反编译器 - https://www.jetbrains.com/decompiler/

ILSpy - https://github.com/icsharpcode/ILSpy

许多软件在用户购买时单独提供激活密钥,而不是嵌入到应用程序中。

如果数据是机密或敏感数据,最好不要将应用程序与它们一起提供。验证用户,然后下载所需数据以完成安装

【讨论】:

    【解决方案2】:

    是的,所有类型的代码都是如此,不仅是 .net,而且托管代码通常更容易反汇编。 “w32dasm”(本机代码)和“Reflector”(.Net 代码)等工具可用于将二进制文件还原为源代码。更糟糕的是,使用名为 Reflexil 的 Reflector 扩展,您实际上可以编辑源代码并重新打包二进制文件!

    ResourcesExtract 或 .NET Resourcer 等应用工具无需反汇编即可用于从 Windows 二进制文件中提取各种资源。

    为了保护您的 .net 源代码(在某种程度上!)使用混淆器(如 Red Gate SmartAssembly)。

    为了保护您的密码(仅在 Windows 7/10 中?),您可以将它们存储在 Windows 凭据管理器中: How to store and retrieve credentials on Windows using C#

    或者使用旧的 DPAPI: https://docs.microsoft.com/en-us/previous-versions/ms995355(v=msdn.10)?redirectedfrom=MSDN#windataprotection-dpapi_topic04

    https://www.meziantou.net/how-to-store-a-password-on-windows.htm

    即使安全地存储/检索,密码在内存中未加密时也可能被盗,也许 SecureString 类可以提供帮助,但这一切都取决于: https://github.com/dotnet/platform-compat/blob/master/docs/DE0001.md

    【讨论】:

      【解决方案3】:

      源代码?不,真的。但是如果密码等被保存为纯字符串,那么它们肯定可以被提取出来。

      最简单的做法是存储您不希望被看到的数据的加密版本。

      【讨论】:

      • 如果数据是二进制的,它可以被混淆,但仍然可以不加密。这个问题的解决方案不是“存储在哪里”,而是“存储什么”
      【解决方案4】:

      确保它可以通过反射读取。您可以使用混淆器来避免反映您的代码。 尝试搜索免费或付费的 .net 混淆器。

      或添加一个层(WebAPI 或 WebService)来与数据库通信并在您的 Windows 应用程序中使用它。因此客户将无法读取您的密码和其他信息。客户端应用程序只会知道您的服务地址

      【讨论】:

      • 错了。通过反思,您可能会发现方法等,但无法了解该方法的实现方式。
      • 错了?只需尝试任何反射器应用程序即可获得方法实现。或者看一下 System.Reflection.MethodBody 命名空间。来自 msdn:“在派生类中重写时,获取 MethodBody 对象,该对象提供对当前方法的 MSIL 流、局部变量和异常的访问。”
      • 这至少具有误导性。如果添加后端服务,则需要密钥才能与后端通信。您需要更改为基于令牌的用户身份验证,然后添加后端以遵循最佳实践。但是添加 API 并不能解决问题
      • 不会误导,可能会丢失。 API中也可以根据需要考虑基于token的认证
      • 对不起,我仍然持有误导,因为在我看来,解决这个问题的方法不是“存储在哪里”,而是“存储什么”。您可以使用通用密钥制作 API,然后您遇到同样的问题。您需要基于用户的身份验证,并将用户/通行证发送到某种服务器(无论服务器是什么)
      猜你喜欢
      • 2017-01-02
      • 2014-09-24
      • 1970-01-01
      • 2019-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-26
      • 1970-01-01
      相关资源
      最近更新 更多