Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

fLaSh_PT

Sistema de registo, baseado em Hardware ID [wiki]

Mensagens Recomendadas

fLaSh_PT
Proteger as aplicações com chaves, torna se por vezes útil. Terá de consistir em um determinado algoritmo lógico, irei demonstrar como implementar este mecanismo baseado em o MacAddress.

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)

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..

Wiki: http://wiki.portugal-a-programar.pt/dev_net:vb.net:hwd


Making the impossible possible and pwing the world on db at a time.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ribeiro55

A maneira como encadeias as coisas é porreira.

Prender registos ao MAC é que já não é grande ideia :)

É boa (pois usam-se cada vez mais adaptadores onboard), mas não é infalível.

Para além de existirem inúmeros monopostos que não estão munidos de adaptadores de rede, basta trocar de placa de rede, por avaria ou qualquer outra situação, e já tens o cliente à perna.

E até já está "wikizado". :) :P :D


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
fLaSh_PT

Bem, eu já usei vários métodos.. este é o ultimo que apliquei em algumas aplicações.. já usei vários mas davam problemas.. caso o disco fosse formatado..

Por exemplo já utilizei o Serial Number do HDD, mas por estranho que pareça, cada vez que o formatava, o Windows devolvia novo ID..

Creio que o MacAddress, é o melhor ID para a sequência lógica do algoritmo, isto porque normalmente o ID deste periférico está localizado na motherboard, e maioria dos PC's utilizam este dispositivo de rende embutido na motherboard, tambem é quase 100% garantido que o ID é único..

Assim o ID só mudará caso seja substituído a motherboard do PC em questão :cheesygrin:

Lembro também que a ideia disto, é criar protecção por chaves por maquina.

Por exemplo, assim é um forma de vender aplicações na Internet com segurança, porque evita a partilha ilegal. Este método é muito conhecido como "Protected with hwd"


Making the impossible possible and pwing the world on db at a time.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bioshock

Nunca utilizei nada assim parecido  :nono1:

Mas parece-me boa ideia, esse código todo, é aplicado em que zona da aplicação? Num form qualquer? Num module?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.