问题:我必须为每个联网客户端提供唯一ID,例如:
一点点解释和一些背景故事:
这个问题基本上是一个古老的问题,也触及了软件复制保护的主题,因为这里提到了该领域中使用的一些机制。在这一点上我应该清楚,我不是在寻找一种复制保护方案。请继续阅读。 :)
我正在开发一个应该在本地网络中工作的客户端 - 服务器软件。我必须解决的一个问题是识别网络中的每个唯一客户端(而不是问题),以便我可以将某些属性应用于每个特定客户端,在特定部署的生命周期中保留并强制执行这些属性。客户端。
在我寻找解决方案时,我发现了以下内容:
这类问题的明显选择是找出BIOS标识符(不过100%确定这是否通过相同的主板型号是唯一的),因为这是我唯一可以依赖的不重复,通过克隆传输,并且无法更改(至少不使用某些用户空间程序)。其他一切都失败了,因为要么不可靠(MAC克隆,任何人?),要么太苛刻(就其对配置变化过于敏感而言)。
我想问的一个问题是,我是否正确地进行了建筑方面的工作?也许有一个更好的工具来完成我必须完成的任务......
我想到的另一种方法类似于握手机制,其中服务器维护一个连接的客户端ID的内部查找表(在任何给定时刻甚至可以完全基于软件和非唯一),并告诉如果在连接时提供重复的ID,则客户端在握手期间提供不同的ID。遗憾的是,这种方法并不能很好地满足在生命周期内将属性绑定到特定客户端的要求之一。
答案 0 :(得分:7)
在我看来,您应该构建与您的要求相对应的唯一ID。此ID可以根据对您很重要的信息(有关软件和硬件组件的一些信息)构建为哈希(如MD5,SHA1或SHA512)。
如果您使用私钥对此类哈希进行签名并且您的软件在启动期间进行验证,则密钥(签名哈希值)已签名(只有公钥必须为与您的软件一起安装)。可以通过不同的在线服务扩展这种解决方案,但企业客户可以找到不太好的在线服务。
答案 1 :(得分:7)
您正在寻找的是Windows WMI。您可以获得主板ID( 在同一类型的主板上是唯一的)或许多其他类型的唯一标识符,并提供一些聪明的种子功能来生成UHID。哇我刚刚组成一个缩写词?
如果您正在寻找专门用于获取主板(BIOS)ID:
WMI class: Win32_BIOS
Namespace: \Root\Cimv2
文档:http://msdn.microsoft.com/en-us/library/aa394077(VS.85).aspx
示例代码:http://msdn.microsoft.com/en-us/library/aa390423%28VS.85%29.aspx
编辑:你没有指定一种语言(我假设是C ++),但这可以用Java(带有COM驱动程序)和任何.NET语言来完成。 / p>
答案 2 :(得分:4)
许多程序使用hostId来构建许可证代码(如基于FlexLM的许可证代码)。根据操作系统看看Matlab的功能:
http://www.mathworks.com/support/solutions/en/data/1-171PI/index.html
还要看看这个问题:
Getting a unique id from a unix-like system
一旦我看到一些基于硬盘驱动器序列号的程序的程序,也许这是不太可能改变的事情。有些人建议使用以太网卡的MAC,但可以重新编程。
答案 3 :(得分:0)
不要依赖MAC和音量ID !!!!!
与验证服务器的连接可能会导致您遇到很多麻烦,因为:
*您的客户可能无法始终连接到互联网
*您的客户可以连接他们需要输入程序的特殊设置(路由器/ NAT /代理/网关),以便连接到验证服务器。
*他们可能会在防火墙后面阻止所有程序,除了少数(我的情况)。在某些情况下,防火墙可能不受其控制(对MOST公司用户有效)!
如果您需要强大的保护,则需要依赖硬件ID。
这是一个完全提供您想要的库:一种可靠的方式来读取计算机的硬件ID。其中,它可以读取CPU ID和HDD ID,它们都是唯一的,永远不会改变(是的,甚至在格式化计算机并重新安装Windows之后都没有)。
有一个已编译的演示应用程序,可以证明ID确实是唯一且永久的:http://www.soft.tahionic.com/download-hdd_id/index.html
还有许多编程语言的演示源代码: http://www.soft.tahionic.com/download-hdd_id/hardware%20ID%20programmer%27s%20DLL.html
使用该库非常简单,因为调用单个函数(当然,在将DLL加载到内存中之后)。