2012-06-27 103 views
2

我编写了一个C#WPF应用程序,该应用程序使用标准.Net SignedXml类签署许可证xml文件。我能够提取公钥和私钥作为xml字符串。我可以安全地在签名应用程序的本地隐藏我的私钥,但远程签名检查应用程序(库)中需要的公钥是什么?考虑选项:我应该在哪里将公钥放在独立的应用程序中

  • KeyContainer:没有好,因为签核发生在2个独立的环境
  • 硬编码:硬编码在我的检查库中的公钥XML字符串。我知道公钥并非秘密,但我怎样才能防止黑客用自己的钥匙取代密钥?我可以签署库,但然后他们可以篡改应用程序使用库...
+0

海盗湾的快速搜索会告诉你,没有这样的事情作为防裂应用程序。你需要做的就是平衡多少时间让你更难以解决问题,而不是困扰尝试的人。很多人会花大力气去破解Windows,但是有人会为你的应用程序付出多少努力。 –

+0

这么说真的..我已经有足够的时间来同意了。复制II PC任何人? :) – Nerwi

回答

1

我把公钥放在inetpub目录之外的目录中,并且如果您将私钥移出电脑,那么有人能做的最坏的事情就是更换公钥并且它不再可以解密,但是当它不能解密以知道发生的事情时,你会被告知。

但是,如果有人能够改变你的文件,你将有更大的问题,只是这一个文件改变。

UPDATE:

哎呀,我错过了,这是一个WPF程序。不幸的是,你所能做的最好的就是将私钥与公钥分开,所以你可以解密,但是如果黑客更改公钥,应用程序将无法正常工作。

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

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

+0

inetpub?我不是在这里谈论一个web应用程序。我想阻止黑客用自己的私钥签名并用他们的公钥替换我的公钥。 – Nerwi

+0

@Nerwi你根本无法相信任何你不能相信你自己的代码不会妥协运行的地方的密钥库。让代码正确运行是将信任置于应用程序中的先决条件。因此,您不妨将您的公钥作为应用程序中的资源进行分发。 –

3

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

当然,硬件和Windows本身都受到任何潜在攻击者的控制,所以你不能真正阻止特定机器​​的妥协。

下面是我用来发布的程序的一个示例。当从许可证角度激活程序时,它将硬件哈希发送到Web服务。这将返回一个包含硬件散列的自签名证书,然后我的程序会在启动时进行检查。如果证书以任何方式改变,程序将停止。

+0

我并不是那么熟悉数字证书。我必须对此进行一些研究。看起来好像是由Windows系统组成,包含了大量的应用程序证书。 – Nerwi

+0

那么你不能相信你在不可信机器上运行的代码。但是,您可以减轻风险。操作系统不易受到攻击。一个用户帐户。即使如此,RoadWarrior的答案是,如果不是明显的错误,至少几个解释很短。 –

+0

@owlstead,如果您能改进我的答案或解释您认为可以改进的地方,我将不胜感激。 – RoadWarrior

相关问题