Ferramentas de Utilizador

Ferramentas de Site


dev_net:vb.net:hwd

Chaves por maquina baseadas em MacAddress

Proteger as aplicações com chaves por maquina, torna se por vezes útil. Terá de consistir em um determinado algoritmo lógico, irei demonstrar como implementar este mecanismo baseado em o 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 duvida uma boa opção, assim permite que uma determinada maquina seja reinstalada continuando a funcionar as mesmas chaves no mesmo hardware.

dev_net/vb.net/hwd.txt · Esta página foi modificada pela última vez em: 2018/05/14 21:37 (Edição externa)