【问题标题】:Where should I put the public key in a standalone application我应该将公钥放在独立应用程序中的哪个位置
【发布时间】:2012-06-27 11:45:22
【问题描述】:

我编写了一个 C# WPF 应用程序,它使用标准的 .Net SignedXml 类对许可证 xml 文件进行签名。我能够将公钥和私钥提取为 xml 字符串。我可以安全地将我的私钥藏在本地用于签名应用程序,但是远程签名检查应用程序(库)中所需的公钥呢?考虑的选项:

  • KeyContainer:不好,因为签名和检查发生在 2 个不同的环境中
  • 硬编码:将公钥硬编码为我的检查库中的 xml 字符串。我知道公钥不是秘密的,但是如何防止黑客用自己的密钥替换密钥?我可以签署图书馆,但随后他们可以使用图书馆篡改应用程序....

【问题讨论】:

  • 海盗湾的快速搜索会告诉你没有破解应用程序这样的东西。您需要做的是在您投入多少时间使其更难破解与可能有人费心尝试的引擎盖之间取得平衡。很多人会不遗余力地破解 Windows,但有人会为您的应用程序付出多少努力。
  • 如此真实.. 我已经存在足够长的时间来同意。 Copy II PC 有人吗? :)

标签: c# .net rsa public-key-encryption


【解决方案1】:

将公钥放入随应用分发的标准数字证书中。然后,Windows 将保证证书的完整性,您可以判断它是否已更改。

当然,硬件和 Windows 本身都处于任何潜在攻击者的控制之下,因此您无法真正阻止特定机器​​的入侵。

这是我曾经分发的程序中的一个示例。从许可证的角度激活该程序时,它会将硬件哈希发送到 Web 服务。这返回了一个包含硬件哈希的自签名证书,然后我的程序在启动时对其进行检查。如果证书以任何方式被更改,程序将停止。

【讨论】:

  • 我对数字证书不是很熟悉。我将不得不对此进行一些研究。好像windows系统的组成,一大堆的应用证书组成。
  • 好吧,你不能信任在不受信任的机器上运行的代码,期间。但是,您可以降低风险。操作系统比例如操作系统更不容易受到损害。一个用户帐户。即便如此,RoadWarrior 的回答即使不是完全错误,至少也有一些简短的解释。
  • @owlstead,如果您能改进我的答案或解释您认为可以改进的地方,我将不胜感激。
【解决方案2】:

我将公钥放在 inetpub 目录之外的目录中,如果您将私钥移出计算机,那么最糟糕的情况就是更换公钥,它不再可以解密,但是您当它无法解密知道发生了什么事情时可以被告知。

但是,如果有人能够更改您的文件,那么您将遇到更大的问题,即仅更改此文件。

更新:

糟糕,我错过了这是一个 WPF 程序。不幸的是,您能做的最好的事情就是将私钥与公钥分开,这样您就可以解密,但如果黑客更改了公钥,应用程序将无法正常运行。

这是使用公钥/私钥的优势之一,可以验证只有您可以进行加密。

另一种选择是从网络服务器获取公钥,但是你也有同样的问题,有人可能会欺骗应用程序转到错误的服务器,所以它不是完全证明的,并且它要求用户有 Internet 连接,并且您可以唯一地识别他们。

【讨论】:

  • inetpub?我不是在这里谈论网络应用程序。我想防止黑客可以用他们自己的私钥签名并用他们的公钥替换我的公钥。
  • @Nerwi 您根本无法信任在您无法信任自己的代码在不妥协的情况下运行的地方的任何密钥库。让您的代码正常运行是信任您的应用程序的先决条件。因此,您不妨将您的公钥作为资源分发到您的应用程序中。
猜你喜欢
  • 2012-06-16
  • 1970-01-01
  • 2021-04-30
  • 2017-07-13
  • 2022-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
相关资源
最近更新 更多