Chaves por maquina baseadas em MacAddress
Chaves por máquina baseadas em MacAddress
Proteger as aplicações com chaves por máquina, torna se por vezes útil. Terá de consistir num determinado algoritmo lógico, irei demonstrar como implementar este mecanismo baseado no MacAddress.
Desenvolvimento
Imports System.Management
Imports System.Text
Public NotInheritable Class HWID
''' <summary>
''' Verifica se uma determinada chave é valida
''' </summary>
''' <param name="sLogic">Extra key logica para esta aplicação</param>
''' <param name="sKey">A chave de registo</param>
Public Shared Function IsValidKey(ByVal sLogic As String, ByVal sKey As String) As Boolean
Dim sK As String = GenerateKey(GetID(sLogic), Nothing)
Return sK.Equals(sKey)
End Function
''' <summary>
''' Gera uma determinada chave
''' </summary>
''' <param name="sLogic">Extra key logica para esta aplicação</param>
Public Shared Function GenerateKey(ByVal sLogic As String) As String
Return GenerateKey(GetID(sLogic), Nothing)
End Function
''' <summary>
''' Obtem o ID do hardware convertido para Hex, este ID é importa para a criação da KeyGen
''' </summary>
''' <param name="sLogic">Extra key logica para esta aplicação</param>
Public Shared Function GetID(ByVal sLogic As String) As String
Return CHex.ConvertToHex(GetMacAddress() & sLogic)
End Function
''' <summary>
''' Gera a key
''' </summary>
''' <param name="sLogicKey">Extra key logica para esta aplicação</param>
''' <param name="sKeys">As chaves geradas por ByRef</param>
Private Shared Function GenerateKey(ByVal sLogicKey As String, ByRef sKeys() As String) As String
Dim lSize As Integer
ReDim sKeys(3)
'Estes dados serão usados para gerar um número de série sem igual.
'Cada caracter da "String" será convertido para o seu valor em "Asc" e somado.
For i As Integer = 1 To (sLogicKey.Length - 1)
lSize += Convert.ToInt32(Asc(Convert.ToChar(sLogicKey.Substring(i, 1))))
Next
Dim sTmp As String = Hex(1050 * lSize)
'Código para gerar a chave
'Cade chave não excederá mais do que 5 caracteres
sTmp = Hex(1000 * lSize) : sKeys(0) = sTmp.Substring(0, 5)
sTmp = Hex(2000 * lSize) : sKeys(1) = sTmp.Substring(sTmp.Length - 5)
sTmp = Hex(3000 * lSize) : sKeys(2) = sTmp.Substring(0, 5)
sTmp = Hex(4000 * lSize) : sKeys(3) = sTmp.Substring(sTmp.Length - 5)
'Formato da Chave
'@@@@@ - @@@@@ - @@@@@ - @@@@@
Return String.Concat(sKeys(0), " - ", sKeys(1), " - " + sKeys(2), " - ", sKeys(3))
End Function
''' <summary>
''' Obtem o ID do hardware MacAddress
''' </summary>
Private Shared Function GetMacAddress() As String
Dim sRet As String = String.Empty
Dim oQuery As New SelectQuery("Win32_NetworkAdapterConfiguration")
Dim oSearcher As New ManagementObjectSearcher(oQuery)
For Each info As ManagementObject In oSearcher.Get()
If info("IPEnabled") Then
sRet = info("MacAddress").ToString()
Exit For
End If
Next
oQuery = Nothing
oSearcher = Nothing
Return sRet
End Function
Private Class CHex
Public Shared Function ConvertToHex(ByVal s As String) As String
Dim keyValue As Char() = s.ToCharArray()
Dim keyByte As Byte() = Encoding.ASCII.GetBytes(keyValue)
Dim str As String = ""
For i As Integer = 0 To keyByte.Length - 1
str += String.Format("{0:x2}", keyByte(i))
Next
Return str
End Function
Public Shared Function ConvertFromHex(ByVal s As String) As String
Dim tmpValue1 As String = s
Dim tmpValue2 As String = ""
Dim str As String = ""
If tmpValue1.StartsWith("0x") Then
tmpValue1 = tmpValue1.Substring(2)
End If
Dim i As Integer = 0
While i < tmpValue1.Length
str = tmpValue1.Substring(i, 2)
tmpValue2 += CChar(ChrW(UShort.Parse(str, System.Globalization.NumberStyles.HexNumber)))
i = i + 2
End While
Return tmpValue2
End Function
End Class
End Class
Exemplo
' Será gerado um ID único por maquina, baseado no MacAddress + extra key logica, que sera convertido pra hex decimal
Dim sKey As String = HWID.GenerateKey("Extra_key_logica_para_esta_app")
MessageBox.Show(sKey)
MessageBox.Show("Key valida: " & HWID.IsValidKey("Extra_key_logica_para_esta_app", sKey) & vbNewLine & sKey)
Conclusão
A utilização do ID do hardware (MacAddress), é sem dúvida uma boa opção, assim permite que uma determinada maquina seja reinstalada continuando a funcionar as mesmas chaves no mesmo hardware.