我想创建一个程序,每次生成相同的字符串,并且每台pc上的程序必须不同。就像HWID一样。在我有了字符串后,我将它发送到远程主机上的php文件中,php处理它,并将其存储在数据库中。
在第一次运行时,它将在表中创建一个新行,但在第二次运行后,它将选择POST-ed散列=表中的散列的行,并且它已被禁止 - 而不是禁止的函数。因此,如果我回复0,电脑没有被禁止,所以程序开始运行,如果我给回程序1关闭。
这是全部制作的,我的问题是,我从processorid生成hwid,并将其发送到php。有时,processorid在不同的计算机上可以是相同的。因此,如果我给予假禁令,用户会为我生气...
问题是:
如何生成一个哈希值,它在运行应用程序的pc上总是一样的,但在每台PC上都不一样?
我知道如果我在电脑上存储一个特殊ID,例如在注册表中,我可以制作它,但如果有人重新安装电脑,他可以再次使用该服务。如果我生成hwid,他将花费更多时间来了解如何再次访问该服务。
答案 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")
对于硬件签名:
还有其他方法。例如,您可以将结果编码为十六进制字符串,但上面是代码显示的内容。首先,这些是您需要的命名空间:
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 =
当你得到答案时,你可以将字符串粘在一起。但在开发过程中,在决定使用它之前,有必要查看候选信息。
注意:
if I store a special id...
没有。不要写下任何东西。无法在自己的PC上保密用户的秘密。不要存储哈希 - 每次都生成它。如果将其写下来,则可以更轻松地将该值复制到其他计算机上。
I give fake ban, the users will be angry for me...
由于听起来您正在使用黑名单而不是白名单,因此您不必担心哈希失败。最糟糕的情况是,应该被拒绝访问的系统将获得访问权限。如果您想进一步降低匹配的可能性,请使用SHA512Managed
;它会产生更长的哈希值。
如果用户更改了您正在轮询的其中一个部分,它们仍会进入 - 两个系统的哈希不太可能匹配(一个白色,一个黑色)。