Visual Basic em Português

Página pessoal de Jorge Paulino sobre o Visual Basic (VB.NET, ASP.NET, VB6, VBA) e algumas noticias de tecnologia

VB.NET: Criptografia - TripleDES

A segurança de dados é algo fundamental em qualquer aplicação e cada vez mais é um motivo de preocupação. Quando se guarda determinado tipo de informação, numa base de dados por exemplo, é importante que a mesma esteja segura, principalmente em alguns campos como é o caso de passwords, números de cartões de crédito, informações confidenciais, etc.

É aí que a criptografia entra, através da encriptação ou codificação de dados. A encriptação é a transformação de informação electrónica de texto legível em texto incompreensível, através de um cifra, também conhecido por algoritmo.

Este processo é bastante complexo mas a .Net Framework através da Namespace System.Security.Cryptography simplifica bastante, tornando-o acessível e fácil de utilizar. Existem diversas classes disponíveis que implementam diferentes tipos de encriptação, como é o caso de: AES (Advanced Encryption Standard), DES (Data Encryption Standard), RC2 (Rivest Cipher), Rijndael, TripleDES (Triple Data Encryption Standard), entre outras.

 

De entre todos os métodos de encriptação disponíveis, alguns são mais seguros do que outros, como é o caso do Rijndael ou do AES. No entanto e para este exemplo, será mostrado a utilização do TripleDES, por ser bastante simples de implementar.

Como curiosidade o TripleDES baseia-se no algoritmo DES que foi utilizado pelo governo norte-americano e que, actualmente, pode ser decifrado. Posteriormente foi desenvolvida uma versão melhorada onde o algoritmo corre três vezes com duas chaves simétricas: o TripleDES.


Para a implementação de uma encriptação utilizando o algoritmo TripleDES devemos criar a seguinte classe:


Imports
System.Text
Imports System.Security.Cryptography

''' <summary>
''' Encriptação simples usando TripleDES
''' (Triple Data Encryption Standard)
''' </summary>
Public Class Crypto

    Private Shared TripleDES As New TripleDESCryptoServiceProvider
    Private Shared MD5 As New MD5CryptoServiceProvider

    ' Definição da chave de encriptação/desencriptação
    Private Const key As String = "CHAVE12345teste"

    ''' <summary>
    ''' Calcula o MD5 Hash 
    ''' </summary>
    ''' <param name="value">Chave</param>
    Public Shared Function MD5Hash(ByVal value As String) As Byte()

        ' Converte a chave para um array de bytes 
        Dim byteArray() As Byte = ASCIIEncoding.ASCII.GetBytes(value)
        Return MD5.ComputeHash(byteArray)

    End Function   

    ''' <summary>
    ''' Encripta uma string com base em uma chave
    ''' </summary>
    ''' <param name="stringToEncrypt">String a encriptar</param>
    Public Shared Function Encrypt(ByVal stringToEncrypt As String) As String   

        Try

            ' Definição da chave e da cifra (que neste caso é Electronic
            ' Codebook, ou seja, encriptação individual para cada bloco)
            TripleDES.Key = Crypto.MD5Hash(key)
            TripleDES.Mode = CipherMode.ECB   

            ' Converte a string para bytes e encripta
            Dim Buffer As Byte() = ASCIIEncoding.ASCII.GetBytes(stringToEncrypt)
            Return Convert.ToBase64String(TripleDES.CreateEncryptor().TransformFinalBlock(Buffer, 0, Buffer.Length))   

        Catch ex As Exception
            MessageBox.Show(ex.Message, My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Error)

            Return String.Empty

        End Try   

    End Function

  

    ''' <summary>
    ''' Desencripta uma string com base em uma chave
    ''' </summary>
    ''' <param name="encryptedString">String a decriptar</param>
    Public Shared Function Decrypt(ByVal encryptedString As String) As String   

        Try

            ' Definição da chave e da cifra
            TripleDES.Key = Crypto.MD5Hash(key)
            TripleDES.Mode = CipherMode.ECB   

            ' Converte a string encriptada para bytes e decripta
            Dim Buffer As Byte() = Convert.FromBase64String(encryptedString)
            Return ASCIIEncoding.ASCII.GetString(TripleDES.CreateDecryptor().TransformFinalBlock(Buffer, 0, Buffer.Length))

        Catch ex As Exception
            MessageBox.Show(ex.Message, My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Error)

            Return String.Empty

        End Try   

    End Function

End Class

   

Depois, para a implementar na aplicação, é só necessário 
   

        Dim source As String = "vbtuga"

        ' Mostra o texto original
        Debug.WriteLine("Texto original  : " & source)

        ' Encripta a string
        Dim result As String = Crypto.Encrypt(source)

        ' Mostra o resultado da encriptação
        Debug.WriteLine("Texto encriptado: " & result)

        ' Decripta e mostra o texto original
        Debug.WriteLine("Texto decriptado: " & Crypto.Decrypt(result))   

   

Neste pequeno teste, o resultado é o seguinte (na Immediate Window):

Texto original     : vbtuga

Texto encriptado: 6ldtC7GfpGg=

Texto decriptado: vbtuga


Este artigo é um exemplo de encriptação de forma a tornar os dados e as aplicações mais seguras. Brevemente, assim que possível, irei mostra mais dois exemplos de encryptação em AES e
Rijndael.

Exemplo do artigo: DOWNLOAD DO FICHEIRO
   

PS: Como sempre, qualquer dúvida, comentário ou correcção ao artigo é sempre bem vinda!


VB.NET: Utilizando o controlo ComboBox

O controlo ComboBox é um controlo muito utilizado nas aplicações. É na realidade a combinação de uma TextBox com uma ListBox. Este permite que sejam definidos alguns estilos o que permite ao utilizado inserir ou escolher dados, ou apenas escolher.

Apesar de bastante simples de utilizar, existem diferentes formas de adicionar itens à lista. Este artigo pretende mostrar algumas das formas de adicionar itens à ComboBox.

A utilização de uma base de dados com fonte de dados é muito comum. Neste pequeno exemplo é lida uma tabela de Access, através de um OleDbDataAdapter e preenchido um DataSet. Depois é definida a fonte de dados (DataSource), o item a listar (DisplayMember) e o item que guarda o valor (ValueMember).

A utilização de parâmetros para o comando Transact-SQL é muito importante. Neste caso tratasse de um exemplo simples, mas o uso de parâmetros evita um grande número de problemas, com é o caso de: formatos das datas (não é necessário especificar o formato correcto), nomes com aspas simples (não é necessário substituir as aspas dos nomes, como é o caso de O’Brien), valores numérico (não é necessário formatar os números), etc.

Imports System.Data.OleDb

    ' No evento Form Load irá ser carregados os dados da base de dados na combobox
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Try

            Dim connString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\dados.mdb;"

            ' Inicia uma ligação à base de dados
            Using connection As New OleDbConnection(connString)

                ' Select Statement que irá mostrar todos os vendedores activos, 
                ' excepto o vendedor que será definido no parâmetro
                Dim SQL As String = "SELECT * FROM Vendedores WHERE activo = ? AND vendedor <> ?"

                ' Define o DataAdapter e os parâmetros. O DataAdapter guarda a ligação, não
                ' sendo necessário abrir com o comando connection.Open()
                Dim da As New OleDbDataAdapter(SQL, connection)
                da.SelectCommand.Parameters.Add("activo", OleDbType.Boolean).Value = True
                da.SelectCommand.Parameters.Add("vendedor", OleDbType.VarChar).Value = "Jorge Paulino"

                ' Preenche o Dataset com os valores da base de dados
                Dim ds As New DataSet
                da.Fill(ds)

                ' Preenche a combobox
                With Me.ComboBox1
                    .DisplayMember = "vendedor"
                    .ValueMember = "id"
                    .DataSource = ds.Tables(0).DefaultView 

                    ' Definições para autocomplete
                    .DropDownStyle = ComboBoxStyle.DropDown
                    .AutoCompleteMode = AutoCompleteMode.Suggest
                    .AutoCompleteSource = AutoCompleteSource.ListItems
                End With

                ' Insere um novo item geral na posição 0
                ' com uma descrição geral a indicar o tipo de lista
                Dim dr As DataRow
                dr = ds.Tables(0).NewRow
                dr.Item("id") = 0
                dr.Item("vendedor") = "Lista Vendedores"
                ds.Tables(0).Rows.InsertAt(dr, 0)

               
' Selecciona o item inserido
                Me.ComboBox1.SelectedIndex = 0 

            End Using

        Catch ex As Exception
            MessageBox.Show(ex.Message, My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Error)

        End Try 

    End Sub

 

Para verificar o item seleccionado, ou o valor, basta fazer o seguinte:

        Debug.WriteLine("Valor seleccionado: " & Me.ComboBox1.SelectedValue)

        Debug.WriteLine("Texto seleccionado: " & Me.ComboBox1.Text)


Depois, pode-se validar e forçar a seleccionar o item da lista. Para o fazer pode-se utilizar o seguinte código, que verifica se o texto da ComboBox está disponível na sua lista, e caso contrário, mostra uma mensagem de erro e selecciona o item por defeito.

Este exemplo não se aplica se o estilo seleccionado for o DropDownList.

    ' No evento Leave verifica se o item escolhido/inserido existe na lista
    Private Sub ComboBox1_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.Leave

        ' Guarda a informação do texto actual
        Dim comboText As String = Me.ComboBox1.Text 

        ' Pesquisam texto na ComboBox e caso não encontre
        If Me.ComboBox1.FindString(comboText) = -1 Then
            MessageBox.Show("O vendedor seleccionado não é válido")
            Me.ComboBox1.SelectedIndex = 0
        End If 

    End Sub

 

Mas existem métodos mais simples de carregar dados na ComboBox. Pode-se, por exemplo, usar um destes métodos para inserir itens à ComboBox em modo run-time .

        ' Define um array de meses
        Dim items() As String = {"Jan", "Fev", "Mar", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez"}

        ' Adiciona o itens à ComboBox e define o estilo com 
        ' DropDownList, ou seja, apenas é possível seleccionar
        With Me.ComboBox2
            .DropDownStyle = ComboBoxStyle.DropDownList
            .Items.AddRange(items)
        End With
   

Finalmente um método bastante usual que insere 50 itens com o formato “01”, “02”, “03”, …

        ' Ciclo que insere 50 itens
        For x As Byte = 0 To 49
            Me.ComboBox2.Items.Add("Item " & x.ToString.PadLeft(2, "0"))
        Next

São pequenos exemplos que pretendem apenas mostrar alguma alternativas de inserir dados em modo run-time à ComboBox, em especial com a utilização de uma base de dados em Access como fonte de dados.                                           

 

PS: Como sempre, qualquer dúvida, comentário ou correcção ao artigo é sempre bem vinda!


VB.NET: Criando HotKeys (teclas de atalho)

Em diversos programas é usual existirem combinações de teclas que executam determinadas tarefas. Estas combinações, normalmente designadas por HotKeys, simplificam a utilização da aplicação. Por exemplo, a combinação CTRL+A abre o Form A, Shift+B imprimir o relatório B, etc. Esta funcionalidade é bastante prática e simples de implementar mas apenas funciona quando o Form está seleccionado (com focus).


Para criar uma ou mais HotKeys que funcionem mesmo sem a aplicação estar seleccionada, utilizasse a função RegisterHotKey(). Deste modo é possível detectar e manipular sempre que uma tecla ou uma combinação de teclas é executada.

Existem combinações que podem ser sobrepostas (por exemplo CTRL+C, ALT+TAB, etc) e por isso é preciso bastante cuidado ao utilizar este código. A má ou incorrecta utilização pode prejudicar o correcto funcionamento do sistema operativo. O objectivo não é desabilitar combinações de teclas mas sim criar combinações ou atalhos que permitam, por exemplo, abrir uma aplicação que está escondida ou que se encontra no "system tray".

O seguinte exemplo mostra como criar algumas HotKeys. Algumas servem apenas para mostrar as implicações caso exista uma má utilização. No final é necessário fazer o processo inverso, ou seja, remover a HotKey do registo, utilizando a função UnregisterHotKey().

   

    ' Cria uma nova lista que guarda os ID's registados
    Private RegistedIDs As New List(Of Integer)

    ' Declara um evento que irá indicar o número do ID registado
    Public Event HotkeyPressedID(ByVal ID As Integer)

    Public Enum HotKeyModifiers
        None = 0
        Alt = 1
        Control = 2
        Shift = 4
        Windows = 8
    End Enum

    ' API's para registar e remover o registo das hotkeys
    Private Declare Function RegisterHotKey Lib "user32" (ByVal handle As IntPtr, ByVal ID As Integer, ByVal fsModifiers As Integer, ByVal vk As Integer) As Boolean
    Private Declare Function UnregisterHotKey Lib "user32" (ByVal handle As IntPtr, ByVal ID As Integer) As Boolean


   
''' <summary>
    ''' Regista (ou tenta) um HotKey usando a respectiva API
    ''' </summary>
    ''' <param name="ID">Número único do registo</param>
    ''' <param name="Modifiers">Indicação do modifier</param>
    ''' <param name="KeyCombo">Indicação da tecla</param>
    Public Function RegisterHotKey(ByVal ID As Integer, ByVal Modifiers As HotKeyModifiers, ByVal KeyCombo As Integer) As Boolean

        ' Caso consiga registar a hotkey
        If RegisterHotKey(Me.Handle, ID, Modifiers, KeyCombo) Then   

            ' Adiciona à lista dos ID's registados
            RegistedIDs.Add(ID)
            Return True
        End If

    End Function

    ''' <summary>
    ''' Subrotina que executa uma acção de acordo com a combinação efectuada
    ''' </summary>
    ''' <param name="ID">Número do ID registado</param>
    Private Sub RegisterHotKeyExample_HotkeyPressedID(ByVal ID As Integer) Handles Me.HotkeyPressedID

        Select Case ID
            Case 0
                Me.TextBox1.AppendText(Now & " - Ctrl+Shift+F" & vbNewLine)
            Case 1
                Me.TextBox1.AppendText(Now & " - Windows+T" & vbNewLine)
            Case 2
                Me.TextBox1.AppendText(Now & " - Alt+Tab bloqueado" & vbNewLine)
            Case 3
                Me.TextBox1.AppendText(Now & " - Letra ‘a’ bloqueada" & vbNewLine)
            Case 4
                Me.TextBox1.AppendText(Now & " - Letra ‘b’ bloqueada" & vbNewLine)
        End Select

    End Sub

    ' Overrides ao WndProc e detecção se a combinação foi efectuada
    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        Const WM_HOTKEY As Integer = &H312

        ' Caso seja uma HotKey
        If m.Msg = WM_HOTKEY Then
            RaiseEvent HotkeyPressedID(m.WParam.ToInt32)
        End If   

        MyBase.WndProc(m)

    End Sub

   

    Private Sub RegisterHotKeyExample_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        ' No evento Form Load são registadas algumas teclas. Os ID's 2,3 e 4 servem
        ' apenas para mostrar que é preciso ter algum cuidado a utilizar este código  

        ' Ctrl-Shift-F
        RegisterHotKey(0, HotKeyModifiers.Control Or HotKeyModifiers.Shift, Keys.F)

        ' Windows+T
        RegisterHotKey(1, HotKeyModifiers.Windows, Keys.T)

        ' Alt+Tab (que irá apenas desabilitar esta combinação)
        RegisterHotKey(2, HotKeyModifiers.Alt, Keys.Tab)

        ' Desabilita as teclas ‘a’ e ‘b’
        RegisterHotKey(3, HotKeyModifiers.None, Keys.A)
        RegisterHotKey(4, HotKeyModifiers.None, Keys.B)

    End Sub


   
' MUITO IMPORTANTE: Garantir sempre que as teclas saem do registo, caso
    ' contrário o sistema operativo pode não funcionar correctamente
    Private Sub RegisterHotKeyExample_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing

        ' Ciclo nos ID's registados
        For Each ID As Integer In RegistedIDs
            UnregisterHotKey(Me.Handle, ID)
        Next

    End Sub


Cada número da HotKey tem de ser único e a combinação de teclas não pode estar a ser utilizada por outra thread. Caso aconteça o resultado do registo é falso e a combinação não é registada.

   

Este exemplo mostra numa caixa de texto a informação da HotKey pressionada, mas é apenas ilustrativo. Existem diversas combinações que podem ser utilizadas que podem melhorar a funcionalidade da aplicação.   

Exemplo do artigo: DOWNLOAD DO FICHEIRO

   

PS: Como sempre, qualquer dúvida, comentário ou correcção ao artigo é sempre bem vinda!




Microsoft Office Especialist

Membro da Comunidade
Experts-Exchange


Administ. da Comunidade
Portugal-a-Programar



Twitter

Artigos no CodeProject

Artigos no CodeProject

Subscrever Novidades

Endereço de Email:

Delivered by FeedBurner

Seguidores

Histórico