vb.net - 在 vb.net 中制作 PC 特定哈希

标签 vb.net hash

我想制作一个程序,每次生成相同的字符串,并且它在每台电脑上都必须不同。就像 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/

相关文章:

c - 以 64 位值作为键的哈希表

c - 在 C 中实现 hmac sha1

swift - 枚举作为字典的键

c# - .NET ToolStrip 标准图标的位置

wpf - 滚动 WPF DataGrid 以在顶部显示所选项目

.net - 为什么这个微软异步服务器示例在不应该阻塞的时候阻塞了?

vb.net - 以编程方式设置 Crystal Report 的自定义纸张尺寸

vb.net - 将项目从列表框拖放到桌面

hash - djb2 哈希函数

java - 有没有办法猜测使用哪种算法生成哈希 key ?