我们想在Windows 8 Metro应用程序中使用唯一的设备标识符,建议使用ASHWID,在此处记录:
http://msdn.microsoft.com/en-us/library/windows/apps/jj553431.aspx
我正在努力寻找如何保证这种独特性。该格式包括每个硬件组件两个字节,其中最唯一可识别的是MAC地址和硬盘序列号。但是,对于这些值,仅两个字节确实看起来还不够。
如果使用的字节不是最低有效位(人类读到的最右边)以外的任何其他字节,那么生产线上相邻的两台相同的笔记本电脑可能会具有相同的ASHWID。 MAC和驱动器序列可能相邻。
因此,我想我问题的症结在于,在您可能会重复之前,必须生产多少个具有相同CPU类型和内存配置的设备。好像和Birthday Paradox一样,所以我找到了一个计算器,并插入了数字:)
有了一个MAC地址和一个硬盘,每个硬盘都有两个字节的标识符,则大约有40亿个排列。一旦分配了其中的6,000个,两个相同的比率大约为50/50。
(转到http://jeff.aaron.ca/cgi-bin/birthday并插入“6563”和“4294967296”进行实际计算)。
因此,这似乎根本不是很独特。我对这个标识符持怀疑态度是对的,还是我错过了真正重要的东西?
最佳答案
不,不保证ASHWID可以唯一标识设备。在工作中,我已经看到数十次日常碰撞,其中一个月是我们的容忍度。
此外,对于同一设备,ASHWID可能会经常更改-因为Windows 8将经常在可能会添加扩展坞,USB拇指驱动器或插入式蓝牙适配器的笔记本电脑上运行。 ASHWID的最佳用途是验证用户仅将您的应用安装到了数量有限的设备上,而您可以通过分析ASHWID并将其与该用户先前查看的ASHWID进行比较来实现。
至于唯一的硬件标识符,我建议包含多个组件的字符串的MD5摘要,其中ASHWID的某些组件可以发挥作用。
您可能会随机生成大量(64位以上)并将其存储(例如,在注册表中)。当然,如果您希望哈希中包含其他内容,则该用户的登录名/ID应该对该用户唯一。您还需要考虑如果用户克隆操作系统安装或在驱动器发生故障后更换HD硬盘时要做什么。
回到Windows桌面世界,我使用了MachineGuid注册表项和启动设备的序列号,但我一直在努力争取在Windows Store应用程序中访问该信息。如果有访问权限,MachineGuid将在HKLM\SOFTWARE\Microsoft\Cryptography
中,MS保证它是唯一的。引导设备::GetVolumeInformationW(::SHGetFolderPathW(~),~)
的序列号将非常唯一,但只有32位。