对于我们的软件,我们使用硬件加密狗来保护软件.没有保护是完美的,但这种商业解决方案是负担得起的,并保持诚实的人诚实(如另一个线程中所述).优点是128位密钥在硬件加密狗上存储"不可读".
我们想要删除此硬件加密狗并开始使用软件保护.基本上我们可以使用商业产品,但另一方面也不会破坏.我对加密知之甚少,这就是我发布这个的原因.如何在Windows计算机上存储无法使用Reflector或其他内容读取的密钥?但是,我应该能够访问用于测试许可证代码的密钥.
我只想要一个简单的解决方案,只需使用Reflector就无法攻击.
或者我问一个非常愚蠢的问题?
谢谢大家的快速和有用的回复.我不想在互联网上使用许可,因为应用程序并不总是在连接的计算机上运行.然后我会得到更多问题然后解决它们.我们现在很可能会寻求商业解决方案.似乎保护不是那么微不足道.
非常感谢!!
没有办法完全保护密钥.如果您的程序可以读取它,那么它可以被另一个程序读取.
我经营一家处理这个问题近20年的软件公司.作为开发人员和企业主,我想首先鼓励您稍微扩大您的目标.例如,将您的问题定义为"防止盗版"只是一个错误.您的目标应该是实现收入最大化.
话虽如此,有些人根本不会购买你的软件,但可能会做出相当大的努力来免费获得它.他们获得免费副本并将大量资源投入到防止它的努力中并非"公平",这在很大程度上是浪费时间.事实上,这些人通常最终"合法"只是为了获得我们的更新列表,获得支持,或者因为他们的业务发展到他们现在可以负担我们的许可证的程度.在这些情况下,最初的盗版最终会增加我们的收入.
那么,我们如何许可?
我们为每次新安装生成一个随机许可证号码(10K到99K之间的数字很好).然后,我们有一个生成匹配数字的算法(任何非平凡的事情都可以).顺便说一下,我们使用随机数,这样任何在另一台计算机上重新安装的尝试都会产生不同的许可证/匹配号码.
接下来,我们要求用户通过电话与我们联系以获取其许可证的匹配号码(这很重要).软件会查看输入的匹配数字,并将其与用户侧生成的匹配值进行比较.如果匹配,则软件完全激活.
我说让他们给我们打电话很重要,因为我们以此为契机与他们讨论他们的设置,回答任何问题,让他们知道他们正在与真人打交道.很少有人有勇气尝试打电话和冒充另一家公司(我们查看并将他们的信息与我们的购买数据库进行比较).请注意,我们的套餐运行近2千美元,因此电话合理.如果您的套餐成本较低且数量较多,您可以通过电子邮件进行此操作.最后,我们使用call-in告诉用户如何使用新许可获得升级和技术支持.
最后,我们将密钥存储在应用程序的数据库(本地安装的MSDE/SQL Express数据库)中,这样任何复制应用程序的尝试都将是非常重要的,并且B)带来了大量特定于组织的数据.首先购买合法版本(使他们不太可能分享).许可密钥被加密并"分割"成两个不同的密钥,这两个密钥保存在两个不同的表中.因此,简单的"找到密钥并将其输入盗版版本"将无法正常工作.
底线?当您创建整个软件包而不仅仅是软件,构建一些基本的保护机制,并介绍人为因素时,您应该看到您不需要加密狗的费用和麻烦来最大化收入.
当然,绝对的答案是,坚定而有技巧的攻击者可以打破任何保护,但是,特别是对于没有高度需求或名望的软件,熟练和坚定的攻击者是罕见的,因此采取保护措施是有道理的.
要验证许可证,将密钥发送到中央位置是最安全的方法,因为他们必须破解您的服务器(或协议,注意)以便能够验证.这需要连接才能使用可能或可能不可行的软件.您还可以将"许可证服务器"与软件一起分发,以进行仅需要本地网络访问的大型安装.如果您不能并且必须仅在本地验证,那么您可以在本机代码中编写一个dll,这会使逆向工程变得更难.
为了保护代码本身,并使其保护更难绕过,混淆:
.NET混淆工具/策略
(为什么)我应该使用混淆?
我应该担心模糊我的.NET代码吗?
对于单个开发人员而言,c#代码保护的最佳价值是什么?
总而言之,您可以从打包的解决方案中获得更好的价值.