我想制作一个程序,每次生成相同的字符串,并且它在每台电脑上都必须不同。就像 HWID 一样。获得字符串后,我将其发送到远程主机上的 php 文件中,php 处理它,并将其存储在数据库中。
第一次运行时,它将在表中创建一个新行,但在第二次运行后,它将选择 POST 哈希 = 表中哈希的行,并且它具有禁止 - 不禁止功能。所以如果我返回 0 电脑不会被禁止,所以程序开始运行,如果我返回 1 程序关闭。
这一切都完成了,我的问题是,我从processorid生成hwid,并将其发送到php.ini。有时不同计算机上的processorid 可能相同。所以如果我给假禁令,用户会为我生气......
问题是:
如何生成一个哈希值,该哈希值在运行应用程序的电脑上始终相同,但在每台电脑上都不同?
我知道如果我在电脑上存储一个特殊的ID(例如在注册表中),我就可以做到这一点,但是如果有人重新安装电脑,他可以再次使用该服务。如果我生成hwid,他将花费更多时间来了解如何再次访问该服务。
最佳答案
我认为这与 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")
对于硬件签名:
- 获取并存储每个项目的信息
- 将它们组合成一个字符串
- 将字符串转换为字节数组
- 使用加密技术对字节数组进行哈希处理
- 将结果转换为 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 激活 key 也是如此。
- 其他加密哈希器将生成更长的哈希值
- 这远非万无一失。
- 有些东西可以被欺骗 - Win 操作系统序列号可以在注册表中更改。你并不真正关心这些值(value)观是否正确,只关心它们不会改变。
- 这不是版权保护。有人可以嗅出从合法系统发送的 token ,然后修补您的应用程序以仅发送该 token 。
如果我存储一个特殊的 ID...
没有。不要写下任何东西。不可能对用户自己的 PC 保守 secret 。也不存储哈希值 - 每次都会生成它。如果您写下来,则可以更轻松地将该值复制到另一台计算机。
我封禁假货,用户会为我生气...
由于听起来您是在黑名单而不是白名单上工作,因此您不必担心哈希失败。最糟糕的情况是本应被拒绝访问的系统却获得了访问权限。如果你想进一步减少匹配的机会,请使用SHA512Managed
;但它会产生更长的哈希值。
如果用户更改了您正在轮询的其中一个部分,他们仍然会进入 - 两个系统的哈希值不太可能匹配(一白一黑)。
关于vb.net - 在 vb.net 中制作 PC 特定哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34981639/