当前位置:  开发笔记 > 编程语言 > 正文

生成唯一的计算机ID

如何解决《生成唯一的计算机ID》经验,为你挑选了3个好方法。

我需要编写一个函数来生成一个id,该id对于运行Windows操作系统的给定机器是唯一的.

目前,我正在使用WMI查询各种硬件参数并将它们连接在一起并散列它们以获得唯一的id.我的问题是,我应该使用的建议参数是什么?目前,我正在使用bios\cpu\disk数据的组合来生成唯一ID.如果每个指标有多个结果,我会使用第一个结果.

但是,我遇到了一个问题,即双引导到两个不同的Windows操作系统的机器在每个操作系统上生成不同的站点代码,理想情况下不会发生这种情况.

作为参考,这些是我目前使用的指标:

Win32_Processor:UniqueID,ProcessorID,Name,Manufacturer,MaxClockSpeed
Win32_BIOS:Manufacturer
Win32_BIOS:SMBIOSBIOSVersion,IdentificationCode,SerialNumber,ReleaseDate,Version
Win32_DiskDrive:Model, Manufacturer, Signature, TotalHeads
Win32_BaseBoard:Model, Manufacturer, Name, SerialNumber
Win32_VideoController:DriverVersion, Name

Fabio Cecone.. 72

我有同样的问题,经过一些研究后我决定最好阅读MachineGuid注册表项HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography,正如@Agnus建议的那样.它是在操作系统安装期间生成的,除非您再安装新的操作系统,否则不会更改.根据操作系统版本,它可能包含嵌入的网络适配器MAC地址(加上其他一些数字,包括随机数)或伪随机数,后者适用于较新的操作系统版本(在XP SP2之后,我相信,但不确定).如果它是伪随机的理论上它可以伪造 - 如果两台机器具有相同的初始状态,包括实时时钟.在实践中,这种情况很少见,但请注意,如果您希望它成为可能受到核心黑客攻击的安全基础.

当然,任何人都可以轻松更改注册表项以伪造机器GUID,但我发现这会破坏Windows的这么多组件的正常操作,在大多数情况下,没有普通用户会这样做(同样,请注意对于铁杆黑客).



1> Fabio Cecone..:

我有同样的问题,经过一些研究后我决定最好阅读MachineGuid注册表项HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography,正如@Agnus建议的那样.它是在操作系统安装期间生成的,除非您再安装新的操作系统,否则不会更改.根据操作系统版本,它可能包含嵌入的网络适配器MAC地址(加上其他一些数字,包括随机数)或伪随机数,后者适用于较新的操作系统版本(在XP SP2之后,我相信,但不确定).如果它是伪随机的理论上它可以伪造 - 如果两台机器具有相同的初始状态,包括实时时钟.在实践中,这种情况很少见,但请注意,如果您希望它成为可能受到核心黑客攻击的安全基础.

当然,任何人都可以轻松更改注册表项以伪造机器GUID,但我发现这会破坏Windows的这么多组件的正常操作,在大多数情况下,没有普通用户会这样做(同样,请注意对于铁杆黑客).


为了澄清这一点,当我将DRM措施放入软件时,我的主要目标是防止人们制造破解,使"专业"盗版者能够毫无限制地出售非法软件副本.我并不担心一个偶然的黑客克隆他的朋友的驱动器只是为了能够使用我的软件.在这种情况下,这些人通常比金钱有更多的时间,而且无论如何也不会为此付出代价.如果软件价格为100美元,而你的工资超过50美元/小时,你只需支付费用.麻烦比2小时花费更多的时间.
如果您克隆驱动器映像,这将保持不变.所以这根本不是防篡改和非常不安全的.
如果您使用sysprep&all正确合法地执行此操作,则不会.对于那些拥有盗版Windows并且"只是克隆"的人来说,这是另一回事.但无论如何,他们不会轻易被阻止.
特别是,在通过克隆主机映像安装Windows的环境中,MachineGuid对于所有这些映像都是相同的.
您可以使用KEY_WOW64_64KEY标志来确保始终获得注册表项的"真实"版本.
这可行吗?我的意思是仅依靠这个密钥就足以建立一个强大的许可系统?
与所有其他DRM措施一样,有一个价格点可以打破它.发现它的价格远低于USB加密狗.如果此类价格点(或所使用的多种方法的组合价格)高于您销售软件的价格,则保护将是有效的.是的,有黑客无论如何都会打破它,只是为了好玩.但那些不是你应该担心的.
当我尝试从C#读取此键值时,由于我的项目是为x86构建的,因此总是返回null.问题的解决方案在这里 - http://stackoverflow.com/a/26699672/507950
@ AbderrahimDz24我提到的产品不再销售; 市场也发生了很大的变化; 现在我不再依赖独立许可证模型了.相反,最好将许可证链接到某个云服务帐户(在大多数情况下,您仍然希望拥有这个帐户,因为现在很难想到"未插入"应用程序)并且这将作为DRM措施.当然,用户可以与某人共享他的登录信息,但随后他的所有数据也将被共享.

2> Paul Alexand..:

使用我们的许可工具,我们考虑以下组件

MAC地址

CPU(不是序列号,而是实际的CPU配置文件,如步进和模型)

系统驱动器序列号(非卷标)

记忆

CD-ROM模型和供应商

视频卡型号和供应商

IDE控制器

SCSI控制器

但是,我们不是仅仅对组件进行散列并创建通过/失败系统,而是创建一个可比较的指纹,可用于确定两个机器配置文件的不同之处.如果差额评级高于指定的公差,则要求用户再次激活.

我们发现,在过去8年中,数十万个最终用户安装使用这种组合可以很好地提供可靠的唯一机器ID - 即使对于虚拟机和克隆的操作系统安装也是如此.


多年来,英特尔芯片中尚未启用CPU序列号.系统调用仍然存在,但它不返回稳定值.我不记得它返回什么 - 虚拟数据或所有机器的相同值.无论哪种方式,它都不是一个可靠的硬件指标.

3> Jonas Gulle..:

自己解析SMBIOS并将其散列为任意长度.有关所有可用的SMBIOS结构,请参阅PDF规范.

要从Windows查询SMBIOS信息,您可以使用EnumSystemFirmwareEntries,EnumSystemFirmwareTablesGetSystemFirmwareTable.

IIRC,CPUID指令中的"唯一ID"已从P3及更新版本弃用.


注意不要做我做的,这是调用GetSystemFirmwareTable('RSMB'...); 并散列整个SMBIOSTableData缓冲区.它工作得很好,直到我遇到一个工作站,它将cpu内部温度写入该表,这意味着我的唯一ID每隔几秒就会改变一次.
请注意,这些功能至少需要Windows Vista,Windows XP Professional x64 Edition,Windows Server 2008或Windows Server 2003 SP1.
推荐阅读
135369一生真爱_890
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有