【问题标题】:How do I store sensitive information in a .Net/WPF app?如何在 .Net/WPF 应用程序中存储敏感信息?
【发布时间】:2014-08-28 04:58:07
【问题描述】:

我需要将加密算法的加密/解密密钥存储在公共 WPF 应用程序上,任何人都可以免费下载。
显然,我想以安全的方式存储这些密钥,以便用户可能看不到它们。

在我看来,这是不可能的,因为反编译一个 .Net 应用程序非常容易,而且混淆它并没有多大用处。我想不出一个地方来存储这些信息,要么是用户不可访问的,要么是“自然”加密的(比如某种“Windows Vault”,但随后用户可以创建一个假装是我自己的应用程序,不是吗?)

从用户可以访问(编译)代码和(清除)app.config 的那一刻起,我看不到如何在本地存储敏感信息。

我在 IIS 上看到了很多对连接字符串进行编码和保护内容的帮助,但在 WPF 应用程序上却没有。

有没有办法使用 .Net/WPF 安全地存储任意数据?

谢谢!

【问题讨论】:

  • 为什么不使用one way encryption (hashing) 来存储您的密码。然后你存储这些。这样一来,即使有人获得了对散列密码的访问权限,解密它们也是 infeasible*。您仍然必须将这些存储在安全的地方,但这比 2 路加密要好
  • 我们使用存储在注册表中的加密密钥,并使用 ProtectedData 类 (msdn.microsoft.com/en-us/library/2fh8203k(v=vs.110).aspx) 完成加密。只有可以生成这些加密数据并存储到注册表中的系统管理员才能使用 Entrophy,使用 MSI 安装程序将注册表推送到客户端。在客户端,我们使用 WCF(它从 machine.config 中获取)服务获取熵来解密注册表中的密钥。我知道总有办法破解它,但它比将它存储在 web.config 中更安全。
  • @Liam:我存储的不是密码,而是我想要解密的信息,例如跟踪 ID。
  • @VRK:谢谢,但由于它是一个公共应用程序,用户是管理员(否则他们无论如何都无法安装该应用程序)。
  • 您可以使用 MSI 安装程序吗?如果是,那么您可以在安装程序本身中推出初始注册表。

标签: c# .net security desktop-application


【解决方案1】:
  1. 不要将它放在应用程序中 - “任何人”都可以使用它。

  2. 将机密(私钥)存储在证书存储中,以便只有具有适当权限的进程才能访问。将安装私钥作为单独流程/设置的一部分,以便管理员除了安装应用程序并让应用程序搜索/查询证书存储之外,还可以执行此操作

【讨论】:

  • 谢谢,但它是一个公共应用程序,任何人都可以访问它,任何人都应该能够安装它。所以不同的访问权限是不可能的。
  • 如果它是公开的,你不能在其中隐藏秘密。您只能将机密隐藏在具有高度限制访问权限的容器中,并且任何用户的随机机器都不是这样的容器。使用安全服务器设置 SSL 并将机密内容传递给服务器。用客户端的公钥加密这个秘密,这样只有那些有权访问私钥的人才能解密它。
【解决方案2】:

简单:你没有。

没有办法做到这一点。没有。曾经。几天之内就被破解的所有复制保护都是基于“嘿,我可以隐藏一些东西”。

您可以将用户特定的数据安全地存储在用户的特定文件夹中 - 并将其留给操作系统来保护这些位置。但是认为您可以在您的应用程序中隐藏加密密钥 - 基本上:如果没有聪明人看到它们(或:没有专门的黑客),您可以隐藏它们。这可能行得通 - 但它“依赖于不是真的想找到它的人”。

【讨论】:

  • 是的,我也是这么想的。
【解决方案3】:

只要信息存储在用户的机器上,您就必须假设他可以访问它;没有办法解决它。如果您想让用户无法访问密钥,唯一的选择是在远程服务器上进行加密,但如果要加密的数据很大,这并不总是可行的选择。

【讨论】:

  • 是的,我也是这么想的。我想不出用户不能访问他计算机上的某些内容的方法,否则我的软件也不能。
猜你喜欢
  • 2022-01-17
  • 2012-12-26
  • 2015-05-03
  • 2023-01-27
  • 2011-11-19
  • 2020-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多