我有一个问题,关于生成一个特定的计算机ID用于许可的目的。 优选地,这个ID应该是基于硬件的,并且因此例如如果用户重新格式化则不应该改变。 而且用户改变生成ID的信息也不容易(甚至不可能)。 目前,我只有两个组件,即cpuID标准和function标志以及机器中第一个物理驱动器的几何形状和总大小。 虽然这似乎是对大多数一般的个人电脑的好,许多上网本例如是用完全相同的硬件,所以你会得到许多机器在这种情况下相同的ID。 你们中的任何一个都可以推荐我可以使用的其他硬件组件吗
我有两个要求:
它不能使用WMI。
它必须在很多情况下工作(包括没有特权或很less特权的用户)。 我想过使用物理驱动器的串行,但如果用户不在pipe理员模式下,似乎很难检索。
find独特的线条
如何在Linux下生成系统范围的唯一ID
在UNIX shell脚本中按照多个字段的唯一值sorting
如何使用Linux shell脚本生成文本文件中唯一行的列表?
我在Windows上使用C ++。
在此先感谢您的任何build议。
亲切的问候,
菲利普·本尼弗
select共享某些列(但不是全部)的行
如何使用linux命令行工具列出文本文件中使用的唯一字符?
最好的方式来获得机器ID在Linux上?
获取独特的线条
您可以使用由硬件制造商分配的第一个MAC地址,并且永远不会更改。
像这样的东西:
/** return string containing first MAC address on computer requires adding Iphlpapi.lib to project */ string GetMac() { char data[4096]; ZeroMemory( data,4096 ); unsigned long len = 4000; PIP_ADAPTER_INFO pinfo = ( PIP_ADAPTER_INFO ) data; char sbuf[20]; string sret; DWORD ret = GetAdaptersInfo( pinfo,&len ); if( ret != ERROR_SUCCESS ) return string("**ERROR**"); for(int k = 0; k < 5; k++ ) { sprintf(sbuf,"%02X-",pinfo->Address[k]); sret += sbuf; } sprintf(sbuf,"%02X",pinfo->Address[5]); sret += sbuf; return( sret ); }
恕我直言,这对于价值高达一千美元的许可软件来说是足够的,所有这一切都是为了防止偶然的消费者与邻居共享软件。 一个有动力的海盗可以绕过它,但是拥有足够的知识和动力的海盗并不经常足以让你花费更多的努力来击败他们,更重要的是,你不想给你的诚实的客户带来不便。
如果您的软件非常有价值,以致出现动机的盗版者是真正的威胁,那么硬件加密狗的成本和不便就变得合理了。
我也不相信堆积更多的硬件签名,磁盘驱动器ID,主板配置等等。 安全性的提高是微不足道的,出现问题的可能性大大增加,最终浪费时间来为客户提供不寻常的设置,让不明身份的人放弃。
使用MAC地址来实现一个简单的系统,这个系统似乎总能工作。 接受一个偶尔的海盗可能会打破你的执照。 把精力集中在改进你的软件上,这样你就能获得更多诚实的客户。
系统可能有多个网卡(例如以太网和无线网卡),用户可以更改演示顺序(为什么用户会这样做?)。 要处理这个问题,许可证需要匹配系统中任何位置的网卡,需要如下代码:
/** The MAC addresses of ethernet network cards present on computer @param[out] vMAC vector of strings containing MAC addresses in XX-XX-XX-XX-XX-XX format returns empty vector on error See discussion of this http://stackoverflow.com/questions/6131123/generating-hardware-based-computerid/6131231#6131231 */ void cLicenser::GetMac( vector < string >& vMac ) { vMac.clear(); char data[4096]; ZeroMemory( data,4096 ); unsigned long len = 4000; PIP_ADAPTER_INFO pinfo = ( PIP_ADAPTER_INFO ) data; DWORD ret = GetAdaptersInfo( pinfo,&len ); if( ret != ERROR_SUCCESS ) return; while ( pinfo ) { if( pinfo->Type == MIB_IF_TYPE_ETHERNET ) ( // ignore software loopbacks and other strange things that might be present continue; char sbuf[20]; string sret; for(int k = 0; k < 5; k++ ) { sprintf(sbuf,pinfo->Address[5]); sret += sbuf; vMac.push_back( sret ); } pinfo = pinfo->Next; } }
几年前我尝试了类似的做法,但都失败了。 我尝试使用硬件ID的组合,我可以阅读。 大多数cpu都有一个cpuID,一个唯一的号码,用来唯一标识和跟踪它们。 但问题是,它不能保证每个cpu都有这个ID。 事实上,当我尝试它时,英特尔赛扬系列没有这个ID。 某些主板(主要是英特尔)还附带了一个可以使用的唯一ID。
我也使用任何/所有MAC ID与cpu ID和MB ID结合作为种子来生成唯一的GUID。 您使用的硬件ID越多,执行得越好。问题是,如果您升级任何硬件组件,则ID会更改,软件密钥将失效。
另外请记住,虚拟机甚至进一步复杂化。 我认为你最好的选择就是去做微软的工作。
Microsoft使用类似的方法获取安装了操作系统的计算机的硬件指纹,并将其与注册码一起通信以激活OS / Office套件的副本。 如果您显着升级硬件(我认为是4个硬件组件),密钥将会更改,您将不得不联系Microsoft并提供证明以重新验证您的Windows副本。
如果您只需要生成一次,则GUID对于创建它的机器将是唯一的。 问题在于,每当您生成一个值时,您都会得到不同的值。 但是,如果每台机器都是一次性的,那么GUID将起作用。
如果每台计算机需要相同并且多次生成,则MAC地址是机器的通用ID(尽管您可能有多个MAC可供选择)。
如果这样的事情简单可靠,微软早就发现并获得专利。
有人试图通过一些硬件爸爸来保护软件,包括在每一个授权的软件包中运送一个叫做“加密狗”的东西。 嘿宝贵的新客户! 只需插入加密狗并运行你的新软件!
看到Rube Goldberg安排三个或四个加密狗连接到另一个加入并行端口,每个软件包都有自己的软件包,这是一个暴动。
许多选择之一是使用cpu ID。 例如,比Windows注册表或网卡好。 你不希望用户每次更换网卡都打扰你。我认为cpuid项目可以作为一个例子和出发点。
也许这种方法会帮助你。 http://www.codeproject.com/Articles/319181/Haephrati-Searching-for-a-reliable-Hardware-ID
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。