2

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

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

2 回答 2

3

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

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

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

于 2012-06-27T11:50:07.823 回答
1

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

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

更新:

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

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

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

于 2012-06-27T11:50:00.207 回答