我正在考虑使用DSS向最终用户分发软件许可证。
基本上,软件许可证是一个简单的文本文件/xml文件,其中包含软件模块和公司信息。此文件将使用私钥进行签名。
软件许可证和数字签名将部署在最终用户的计算机上。当应用程序启动时,它将使用已知的公钥验证软件许可证是否有效。如果它有效,它将读取软件许可证中的信息,并打开许可使用的功能。
然而,这是该协议的一个弱点。软件许可证是一个可读的文本文件。任何人都可以生成公钥/私钥对,签署软件许可证,并用假公钥修补软件。它将通过验证过程,并可能创建自己的软件许可证。
有什么好的方法可以防止伪造的数字签名吗?
我不知道您正在使用什么工具来开发代码,但有一篇关于如何在.NET框架世界中实现这一点的精彩描述,请参阅http://www.codeproject.com/Articles/4940/Using-XML-Digital-Signatures-for-Application-Licen.公钥被嵌入到应用程序本身的代码中。我使用了一个类似的方案来许可一个Ruby插件。
如果有人真的决心破解你的保护,那么他们会这么做。然而,这个计划将阻止99.9%的人试图窃取你的软件。
不可能完全保护您的软件免受盗版。不管怎样,你都必须以某种方式分发你的公钥,然后盗版者可以用自己的公钥进行交换。然而,你可以试着让他们更困难。例如,通过将公钥作为字符串嵌入到可执行文件中。你甚至可以对它进行一些基本的加密,使其更难找到。
但是,如果你的软件值得破解,它将被破解。
任何人都可以生成公钥/私钥对,签署软件许可证,并用假公钥修补软件。它将通过验证过程,并可能创建自己的软件许可证。
有什么好的方法可以防止伪造的数字签名吗?
同样,你可以防止有人完全禁用数字签名检查。你的问题就像问你如何阻止小偷从你二楼最左边的窗户进来。这不是他要穿过的窗户,无论如何,你把他挡在外面,就像阻止他从你的其他窗户进来一样。
有两种方法可以防止使用新的密钥对进行签名。
-
用DLL嵌入公钥。通过这种方式隐藏公钥。
-
使用公钥
Pinning
技术。这涉及到从签字机构获得证书,这对个人来说很困难。这一切都属于PKI
(公钥基础设施)。 - 第三种方法是应用非对称加密技术(例如AES)来加密已签名的许可证文件,并将其嵌入到许可证dll中。这使得许可证中的信息不那么明显,可以防止基本攻击
正如其他人所指出的,这不是万无一失的,只是解决了你提出的问题。