Jump to content
  • 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]

Recommended Posts

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.

Share this post


Link to post
Share on other 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"

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.