Я не думаю, что это действительно имеет какое-либо отношение к PHP, но полностью относится к шагам на стороне клиента.
Чтобы сделать то, что вам кажется, вы хотите использовать аппаратную подпись, состоящую из нескольких вещей, так что если один или два недоступны, результат остается в силе. Это будет использовать форму процедуры опроса WMI из ответа на Ваш last question:
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 to hash массив байтов
- преобразовать результат в строку base64
Есть и другие способы. Например, вы можете закодировать результат как Hex-строку, но приведенный выше код показывает.Во-первых, эти пространства имен вам нужно:
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...
Нет. Ничего не записываю. Его невозможно держать в секрете от пользователя на своем ПК. Не храните хеш - генерируйте его каждый раз. Если вы его запишите, проще скопировать это значение на другую машину.
I give fake ban, the users will be angry for me...
Поскольку это звучит, как вы работаете из черного списка, а не белый список, вы не должны беспокоиться о хэш не удается. Худшее, что произойдет, - это получить доступ к системе, которой должен быть отказано в доступе. Если вы хотите еще больше уменьшить вероятность совпадения, используйте SHA512Managed
; он будет генерировать более длинный хэш.
Если пользователь меняет одну из частей, которые вы опросили, они все равно попадут - маловероятно, что хэш из двух систем будет соответствовать (один белый, один черный).
как это связано с php? Есть ли для него особый аспект? – Plutonix
Я отправляю данные на url/handle.php, и если isset $ _POST ['hwdata'] Я делаю вещи, если не просто пустую страницу. – Vbnetguy
Так как теперь вы можете найти ответы, пожалуйста, нажмите вверх по шкале рядом с asnwer, если это поможет – Plutonix