Ir para o conteúdo

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.