use*_*688 5 matlab software-distribution license-key matlab-compiler
我正在考虑使用 Matlab 编译器来按价格分发软件。我正在研究(非常)简单的方法来阻止重新分发而不打扰用户。有什么建议吗?
一种想法是通过电子邮件向用户发送许可证密钥,并让他们在安装过程中输入该密钥,以便在许可证服务器上进行验证。如果密钥与服务器上的密钥匹配,则安装将照常进行,否则,将显示一条警告消息,通知用户购买另一个许可证。然而,这种方法要求指定的功能仅在安装过程中运行,而不是在安装之后运行(以免惹恼用户)。使用 Matlab 编译器或其他方式可以实现这一点吗?
我想我可以在用户的磁盘上创建一个文件,程序在启动时会查找该文件(如果存在,则不是第一次运行),但是如果用户复制整个目录,则该文件将被复制也。
为了创建有效的许可系统,您必须将其链接到用户计算机的一个或多个属性(MAC 地址、操作系统 ID、硬盘序列号、CPU 序列号等)。
如果您不这样做,您将只是发布可以从一个用户转移到另一个用户的许可证。如果一个用户决定在全世界传播他的许可证文件,那么您就注定失败,因为每个人都可能获取该许可证文件并使用它来解锁您的应用程序。
但是,如果您将许可证文件链接到用户计算机的一个或多个属性,如上所述,您必须能够获取这些属性:
第一个场景
您将软件作为试用版发布。当它第一次启动时,您可以在注册表中或隐藏在某处的文件中设置到期日期。当应用程序启动时,您会检查到期日期,一旦到达,您就会抛出一个错误,并且不再让旧版本与您的应用程序一起使用。
在应用程序中,您Register Now在某处创建一个按钮。单击后,应用程序将检索机器属性并将其传递到将打开的网页/表单以让用户执行付款。该页面将负责验证机器属性、接收付款并最终根据这些属性提供有效的许可证代码。
在应用程序中,您必须实现允许表单创建许可证代码的相同逻辑,因为每次应用程序启动时您都需要使用它们来验证代码本身。伪代码示例:
mp1 = GetMachineProperty1();
mp2 = GetMachineProperty2();
mp3 = GetMachineProperty3();
lc = GetLicenseCode();
if (~strcmp(sha1([mp1 mp2 mp3]),lc))
errordlg('Invalid license code!');
return;
end
Run Code Online (Sandbox Code Playgroud)
这是最简单的路径。但请记住,如果用户计算机的一个或多个属性发生变化(因为他更改了设备或重新安装了操作系统),他的许可证将失效,您将必须提供处理此类情况的客户帮助服务。
第二个场景
这个要难得多。您将无法提前了解用户的机器属性。因此,您的许可系统将分两步运行。LID当用户购买您的应用程序时,您会发布一个唯一的代码(例如称为)。然后,一旦用户将其插入到您的应用程序中,您的应用程序必须将其与计算机属性一起发送回。然后计算最终密钥(LKey例如调用)并将其发送回用户。
mp1 = GetMachineProperty1();
mp2 = GetMachineProperty2();
mp3 = GetMachineProperty3();
lkey = GetLicenseKey();
if (~strcmp(sha1([mp1 mp2 mp3]),lkey))
errordlg('Invalid license code!');
return;
end
Run Code Online (Sandbox Code Playgroud)
机器特性
第一个解决方案已通过注释提供给您:MachineGuid位于注册表项中的值HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography。非常坚固。但它只能在 Windows 机器上运行。用于winqueryreg访问注册表。
另一个不错的选择是Window Domain Controller Security ID,它是另一个特定于机器的唯一标识符。Java您可以使用Matlab 中的代码检索它:
wdc_sid = com.sun.security.auth.module.NTSystem.getDomainSID();
Run Code Online (Sandbox Code Playgroud)
或通过 Windows 注册表项HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\GroupMembership。如果您想与旧的 Matlab 版本保持一定的向后兼容性,则应该使用注册表方法。不幸的是,这Window Domain Controller Security ID是另一个仅在 Windows 下运行的计算机上可用的标识符。
如果你想让你的许可系统适应每一个可能的操作系统和环境,你必须使用一种更通用的方法,基于普遍可访问的硬件属性:MAC地址、硬盘序列号等。据我所知,最可靠的属性是MAC地址,因为它的唯一性(尽管未被授予)几乎是确定的,而且更换网络适配器的情况很少(实际上损坏硬盘的机会更多)。Java使用如下代码检索机器网络适配器的 MAC 地址:
mac_addrs = '';
net_int = java.net.NetworkInterface.getNetworkInterfaces();
while (net_int.hasMoreElements)
mac_addr = net_int.nextElement.getHardwareAddress();
if (~isempty(mac_addr))
mac_addrs = [mac_addrs, '-', sprintf('%.2X',typecast(mac_addr,'uint8'))];
end
end
mac_addrs = mac_addrs(2:end);
Run Code Online (Sandbox Code Playgroud)
上述计算生成一个字符数组,表示机器上找到的所有 MAC 地址的串联结果。同样,出于兼容性原因,这可能不适用于旧的 Matlab 版本,因此您必须使用更复杂的方法,如此处所述。
[编辑]
这种根据底层操作系统检索 MAC 地址的方法可能更容易:
switch computer('arch')
case {'maci','maci64'}
[~,a]=system('ifconfig');
c=strfind(a,'en0');if ~isempty(c),a=a(c:end);end
c=strfind(a,'en1');if ~isempty(c),a=a(1:c-1);end
% find the mac address
b=strfind(a,'ether');
mac_add=a(1,b(1)+6:b(1)+22);
case {'win32','win64'}
[~,a]=system('getmac');b=strfind(a,'=');
mac_add=a(b(end)+1:b(end)+19);
case {'glnx86','glnxa64'}
[~,a]=system('ifconfig');b=strfind(a,'Ether');
mac_add=a(1,b(1)+17:b(1)+33);
otherwise,mac_add=[];
end
Run Code Online (Sandbox Code Playgroud)
我是在这篇文章的评论里找到的。
| 归档时间: |
|
| 查看次数: |
361 次 |
| 最近记录: |