我编写了一个C#WPF应用程序,它使用标准的.Net SignedXml类来签署许可证xml文件。我能够将公钥和私钥提取为xml字符串。我可以放心地将我的私钥放在签名应用程序的本地,但是远程签名检查应用程序(库)中需要的公钥呢?考虑的选项:
答案 0 :(得分:3)
将公钥放入随应用程序分发的标准数字证书中。 Windows将保证证书的完整性,您可以判断它是否已被更改。
当然,硬件和Windows本身都受到任何潜在攻击者的控制,因此您无法真正防止特定计算机的危害。
以下是我过去分发的程序示例。从许可证角度激活程序时,它会向Web服务发送硬件哈希。这返回了一个包含硬件哈希的自签名证书,我的程序在启动时会检查该证书。如果证书已经以任何方式更改,程序将停止。
答案 1 :(得分:1)
我将公钥放在inetpub目录之外的目录中,如果你将私钥从计算机上移开,那么最糟糕的人就是更换公钥而它不再能够解密,但你当它无法解密以了解发生的事情时,可以得到通知。
但是,如果有人能够更改您的文件,您将遇到更大的问题,只需更改这一个文件。
<强>更新强>
哎呀,我错过了这是一个WPF程序。不幸的是,您可以做的最好的事情是将私钥与公钥分开,因此,您可以解密,但如果黑客更改了公钥,则应用程序将无法正常运行。这是使用公钥/私钥的优点之一,验证只有您可以进行加密。
另一种选择是从网络服务器获取公钥,但是你有同样的问题,因为有人可能欺骗应用程序转到错误的服务器,所以它不是完全证明的,并且它将要求用户具有Internet连接,并且您可以唯一地识别它们。