9

我们希望在 Windows 8 Metro 应用程序中使用唯一的设备标识符,建议使用 ASHWID,记录在此:

http://msdn.microsoft.com/en-us/library/windows/apps/jj553431.aspx

我正在努力看看如何才能保证这是独一无二的。该格式包括每个硬件组件两个字节,其中最唯一可识别的是 MAC 地址和硬盘序列号。但是这些值只有两个字节似乎还不够。

如果使用的字节不是最低有效数字(最右边,人类读取它们),那么生产线上相邻的两台相同的笔记本电脑可能具有相同的 ASHWID。MAC 和驱动器序列可能是相邻的。

所以,我想我的问题的症结在于,必须生产多少台设备具有相同的 CPU 类型和内存配置,然后才可能出现重复。似乎和生日悖论一样的问题,所以我找到了一个计算器并插入了数字:)

使用一个 MAC 地址和一个硬盘,每个硬盘都有两个字节的标识符,您有大约 40 亿个排列。一旦你只分配了 6,000 个,你有两个相同的大约是 50/50。

(请访问http://jeff.aaron.ca/cgi-bin/birthday并插入“6563”和“4294967296”进行实际计算)。

所以这看起来真的不是很独特。我对这个标识符持怀疑态度是对的,还是我错过了一些真正重要的东西?

4

2 回答 2

4

不,ASHWID 不能保证唯一标识设备。在工作中,我已经看到了几十次每天的碰撞,其中一个月是我们的容忍度。

此外,同一设备的 ASHWID 可能会经常更改——因为 Windows 8 通常会在可能添加坞站、USB 拇指驱动器或插入式蓝牙适配器的笔记本电脑上运行。ASHWID 的最佳用途是验证用户是否仅将您的应用安装到了有限数量的设备上,您可以通过解析 ASHWID 并有选择地将其与该用户之前看到的 ASHWID 进行比较来做到这一点。

至于唯一的硬件标识符,我建议使用包含多个组件的字符串的 MD5 摘要,其中 ASHWID 的某些组件可以发挥作用。

您可能会随机生成一个大数字(64 位以上)并将其存储(例如在注册表中)。当然,如果您希望在哈希中包含其他内容,则用户的登录名/ID 对于该用户应该是唯一的。如果用户克隆操作系统安装或在驱动器故障后更换 HD,您还需要考虑您想要做什么。

回到 Windows 桌面世界,我使用了 MachineGuid 注册表项和启动设备的序列号,但我正在努力在 Windows 应用商店应用程序中访问该信息。如果您有权访问,MachineGuid 位于 中HKLM\SOFTWARE\Microsoft\Cryptography,MS 保证它是唯一的。引导设备的序列号::GetVolumeInformationW(::SHGetFolderPathW(~),~)将是唯一的,但只有 32 位。

于 2014-02-10T19:56:28.937 回答
1

来自文章:

ASHWID 通过表示几个单独的硬件特性,在应用程序/包和设备之间提供了强大的绑定。为了保护用户隐私,ASHWID 因应用程序而异。除非底层硬件发生变化,否则来自同一应用程序的两次调用将产生相同的 ASHWID。但是,如果设备的硬件配置文件发生变化,例如当用户拔出 USB 蓝牙适配器时,ASHWID 也会发生变化。后端云服务可以验证 ASHWID 并将其与之前报告的值进行比较。尽管 ASHWID 有所不同,但可以对其进行解析以检测差异是否仅仅是由于微小的变化(例如向系统添加内存)造成的。对差异的容忍程度取决于后端云服务的实施。

ASHWID 由 9 个组件组成:

  1. 处理器的 CPU ID
  2. 内存大小
  3. 磁盘设备的序列号
  4. 网络适​​配器(NIC MAC 地址 - 第一个实例)
  5. 音频适配器
  6. 坞站
  7. 蓝牙地址
  8. 移动宽带设备 ID
  9. BIOS

CPU ID 仅对处理器型号唯一,但 NIC MAC 地址应该是唯一的。话虽如此,MAC 地址可以被克隆,USB NIC 可以从一个设备移动到另一个设备。所以,虽然我猜两个设备有可能具有相同的 ASHWID,但这种可能性很小。使用此 ID 最具挑战性的是硬件可以更改。由服务决定他们允许更改 ASHWID 的哪些部分以及不允许更改哪些部分(可接受的差异)。文章本身提供了这方面的指导。

于 2012-10-09T20:48:13.087 回答