完全与Microsoft一样生成BIOS制造商HWID(来自SHA-1的GUID)

时间:2017-08-01 07:57:00

标签: c# .net vb.net hash guid

SCENARIO

我想在 C# VB.NET 中了解如何生成硬件ID。基于微软开发人员为此做的相同方法。

首先,在继续之前,我必须宣传这个问题是一个更好的具体不同的问题,来自另一个问题:Get Hardware IDs like Microsoft does

基于 SMBIOS 表创建Microsoft的HWID的基本问题在上面链接的问题的答案中有所描述,并且在这里更深入: Specifying Hardware IDs for a Computer

我尝试重现他们的方法的原因只是遵循关于如何以正确的方式做事的专业标准指南:微软的方式。

问题

由于从托管 .NET 获取 SMBIOS 表似乎是一个不可能/未实现的任务,而且我也无法找到Win32的任何示例用法示例函数:GetSystemFirmwareTable,无论如何解析 SMBIOS 表的字段对于一个单独的开发来说似乎是一个真正的噩梦。 ...因为我怀疑需要在短时间内维护/更新有效的解析器算法:SMBIOS version history

...然后我假设了这一切,我选择使用 WMI 类来重现限制( SMBIOS 字段 WMI 不会使用 WMI 公开或始终为null,这些都是我可以从Microsoft的HWID实现的原始概念中重现的。

要尝试开始复制Microsoft所做的事情,我尝试开始生成仅占用一个字段的HWID: SMBIOS 制造商。

我的问题是,我做错了什么,而且我不确切地知道它可能是什么......

所以,我注意到我的代码存在的问题:

(我在这个问题的' 情景'部分内链接的网址中解释了这些HWID创建的基础知识,我坚持认为)

  • 我的 SHA-1 字符串为40个字符。长度。 System.GUID结构不需要这个长度的字符串,也不接受我计算的 SHA-1 的原始字节数据。

  • @ Richard Hughes 他说 here

  

然后,您需要使用类型5(SHA-1)UUID生成方案   70ffd812-4c7f-4c7d-0000-000000000000作为命名空间

...但我承认我不明白他对使用密码的命名空间意味着什么?在构建 SHA-1 字符串时,我可能错过了这些细节。我试图分析SHA1CryptoServiceProvider类的成员来搜索某些属性,在哪里指定命名空间......没有找到。

这是我正在使用的代码,其中我硬编码制造商字符串检索只是为了简化:

C#样本:

string manufacturer = "American Megatrends Inc.";
byte[] charBuff = Encoding.Unicode.GetBytes(manufacturer); // UTF-16
byte[] hashBuff = null;
string hashStr = null;

using (SHA1CryptoServiceProvider cypher = new SHA1CryptoServiceProvider()) {
    hashBuff = cypher.ComputeHash(charBuff);
    hashStr = BitConverter.ToString(hashBuff).Replace("-", ""); // Same string conversion methodology employed in a MSDN article.
}
Debug.WriteLine("SHA-1=\"{0}\"", hashStr); // SHA-1="0E74E534EE9F1985AE173C640302F58121190593" 

Guid guid = new Guid(hashBuff); // System.ArgumentException: 'Byte array for GUID must be exactly 16 bytes long.'

VB.NET示例:

Dim manufacturer As String = "American Megatrends Inc."
Dim charBuff As Byte() = Encoding.Unicode.GetBytes(manufacturer) ' UTF-16
Dim hashBuff As Byte()
Dim hashStr As String

Using cypher As New SHA1CryptoServiceProvider
    hashBuff = cypher.ComputeHash(charBuff)
    hashStr = BitConverter.ToString(hashBuff).Replace("-", "") ' Same string conversion methodology employed in a MSDN article.
End Using
Debug.WriteLine("SHA-1=""{0}""", hashStr) ' SHA-1="0E74E534EE9F1985AE173C640302F58121190593"

Dim guid As New Guid(hashBuff) ' System.ArgumentException: 'Byte array for GUID must be exactly 16 bytes long.'

预期得到的 GUID ComputerHardwareIds.exe 工具生成的 GUID 相同:

  

{035a20a6-fccf-5040-bc3e-b8b794c57f52}< - 制造商

问题

嗯,只是......我需要什么以及如何修复我的代码以获得预期的结果?

0 个答案:

没有答案