在vb.net中制作pc特定哈希

时间:2016-01-24 21:22:11

标签: vb.net hash

我想创建一个程序,每次生成相同的字符串,并且每台pc上的程序必须不同。就像HWID一样。在我有了字符串后,我将它发送到远程主机上的php文件中,php处理它,并将其存储在数据库中。

在第一次运行时,它将在表中创建一个新行,但在第二次运行后,它将选择POST-ed散列=表中的散列的行,并且它已被禁止 - 而不是禁止的函数。因此,如果我回复0,电脑没有被禁止,所以程序开始运行,如果我给回程序1关闭。

这是全部制作的,我的问题是,我从processorid生成hwid,并将其发送到php。有时,processorid在不同的计算机上可以是相同的。因此,如果我给予假禁令,用户会为我生气...

问题是:
如何生成一个哈希值,它在运行应用程序的pc上总是一样的,但在每台PC上都不一样?

我知道如果我在电脑上存储一个特殊ID,例如在注册表中,我可以制作它,但如果有人重新安装电脑,他可以再次使用该服务。如果我生成hwid,他将花费更多时间来了解如何再次访问该服务。

1 个答案:

答案 0 :(得分:3)

我不认为这与PHP有任何关系,但完全是关于客户端的步骤。

要执行您想要的操作,您希望使用由多个内容组成的硬件签名,以便如果一个或两个不可用,则结果仍然有效。这将使用您last question上的答案中的WMI轮询程序形式:

Private Shared Function GetHardwareItemInfo(item As String, wmiclass As String) As String
    Dim data As String = ""
    Dim query As String = String.Format("Select {0} From {1}", item, wmiclass)
    Using mbs As ManagementObjectSearcher = New ManagementObjectSearcher(query)
        For Each mo As ManagementObject In mbs.Get
            For Each pd As PropertyData In mo.Properties
                ' should be only one
                If String.Compare(pd.Name, item, StringComparison.InvariantCultureIgnoreCase) = 0 Then
                    ' value is object, test for Nothing
                    If pd.Value IsNot Nothing Then
                        data = pd.Value.ToString
                    End If
                    Exit For
                End If
            Next
        Next
    End Using

    Return data
End Function

这允许您使用相同的代码轮询不同wmi类中的不同项。例如:

' get the serialnumber item from the baseboard class:
answer = GetHardwareItemInfo("serialNumber", "Win32_BaseBoard")

对于硬件签名:

  • 获取并存储每个项目的信息
  • 将它们合并为一个字符串
  • 将字符串转换为字节数组
  • 使用crypto来散列字节数组
  • 将结果转换为base64字符串

还有其他方法。例如,您可以将结果编码为十六进制字符串,但上面是代码显示的内容。首先,这些是您需要的命名空间:

Imports System.Security.Cryptography
Imports System.Management
Imports System.Text

然后使用上面GetHardwareItemInfo方法获取内容的过程:

' place to store bits of data
Dim HWStuff As New List(Of String)
Dim answer As String

' get and store some info
answer = GetHardwareItemInfo("serialNumber", "Win32_BaseBoard")
HWStuff.Add(answer)
answer = GetHardwareItemInfo("uuid", "win32_ComputerSystemProduct")
HWStuff.Add(answer)
answer = GetHardwareItemInfo("serialNumber", "Win32_OperatingSystem")
HWStuff.Add(answer)
'...etc

' glue the bits together into one string
Dim HWSig = String.Join("", HWStuff)
Dim byteHash As Byte()

' create crypto hasher
Using hasher = New SHA1Managed()
    ' convert the string to bytes
    Dim tmpBytes = Encoding.UTF8.GetBytes(HWSig)
    'hash the bytes
    byteHash = hasher.ComputeHash(tmpBytes)
End Using
' encode as B64 string.
Dim HWHash = Convert.ToBase64String(byteHash)

Console.WriteLine(HWHash)

结果:

  

MUjeLeZtbTQ3Rc8zgFquBkOwFzA =

当你得到答案时,你可以将字符串粘在一起。但在开发过程中,在决定使用它之前,有必要查看候选信息。

注意:

  • 有很多东西可供选择。见WMI Win32 Classes
  • 并非一切都需要来自WMI。 LocalMachine名称可能是一个很好的名称(我不知道这个上下文)和Windows激活密钥一样。
  • 其他加密垫圈会产生更长的哈希值
  • 这远非万无一失。
  • 有些事情可能会被欺骗 - 可以在注册表中更改Win OS序列号。你真的不在乎价值是否正确,只是他们没有改变。
  • 这不是复制保护。有人可以嗅出从合法系统发送的令牌,然后修补您的应用程序以仅发送该令牌。

if I store a special id...

没有。不要写下任何东西。无法在自己的PC上保密用户的秘密。不要存储哈希 - 每次都生成它。如果将其写下来,则可以更轻松地将该值复制到其他计算机上。

I give fake ban, the users will be angry for me...

由于听起来您正在使用黑名单而不是白名单,因此您不必担心哈希失败。最糟糕的情况是,应该被拒绝访问的系统将获得访问权限。如果您想进一步降低匹配的可能性,请使用SHA512Managed;它会产生更长的哈希值。

如果用户更改了您正在轮询的其中一个部分,它们仍会进入 - 两个系统的哈希不太可能匹配(一个白色,一个黑色)。