我应该在哪里将公钥放在独立的应用程序中

时间:2012-06-27 11:45:23

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

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

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

2 个答案:

答案 0 :(得分:3)

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

当然,硬件和Windows本身都受到任何潜在攻击者的控制,因此您无法真正防止特定计算机的危害。

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

答案 1 :(得分:1)

我将公钥放在inetpub目录之外的目录中,如果你将私钥从计算机上移开,那么最糟糕的人就是更换公钥而它不再能够解密,但你当它无法解密以了解发生的事情时,可以得到通知。

但是,如果有人能够更改您的文件,您将遇到更大的问题,只需更改这一个文件。

<强>更新

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

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

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