如何在Ruby中使用唯一的硬件ID保护代码?

时间:2019-02-13 09:28:53

标签: ruby windows source-code-protection

我即将在Windows上出售我的Ruby应用程序,并且我想保护我的软件不被盗用或复制。 我不会发布它,因此它需要与机器相关。

我需要我的代码来在启动时获取任何PC的MAC地址,并将其与服务器中存储的文件进行比较。我试图从MAC地址构建唯一的串行代码,但是'macaddr'gem在某些计算机上返回错误。该代码在某些计算机上将失败:

require 'macaddr'
mac = Mac.addr
puts mac
# >> NoMethodError: undefined method 'pfamily' for nil:NilClass

如何获取一些唯一的系统ID并从中构建序列号?是否有另一种方法可以从Ruby计算机中获取唯一的硬件ID?

2 个答案:

答案 0 :(得分:0)

首先,我建议您不要使用MAC地址。这很容易被欺骗。

其次,我建议您不要使用硬件ID。除了在获得可靠的许可证方面发现明显的困难(我认为Windows许可证是最好的选择)之外,这可能会将您的软件绑定到特定计算机上。

相反,我建议使用某种登录系统,将用户名和哈希(密码)发送到服务器,并获取UUID。每次有人使用该软件时(或每小时一次,这取决于哪个版本更适合您的软件),使用uuid对服务器执行ping操作以检查用户是否未登录另一台计算机。在处理软件没有响应的情况时要大方,不要立即锁定软件-允许一个小时,甚至一天。如果适合您的软件,则弹出一个小警告,指出如果X分钟内未检测到互联网连接,则该软件将被锁定。

请记住,您希望人们将您的软件推荐给其他人。如果您的许可系统大部分是不可见的,那么人们会对您的软件有更高的评价。如果他们不停地面对他们,他们最终会反感你。

答案 1 :(得分:0)

我通过从Ruby调用以下cmd命令来解决:

system('wmic nic get "MACAddress" |more >> mac.txt')
# >> Will print all MAC addresses inside "mac.txt" file

system('wmic csproduct get "UUID"')
# >> Will print an unique UUID

也许有更好的方法,但是我不是专家,这解决了我的问题。
我使用的是Windows 10 Pro 64位,而我的Ruby版本是:

C:\>ruby -v
# >> ruby 2.3.3p222 (2016-11-21 revision 56859) [x64-mingw32]