Colabora
 

Crear un inputbox personalizado

Con protección de seguridad para evaluación de contraseñas

Para Visual Basic 2005 o superior

 

Fecha: 17/Sep/2008 (16-09-08)
Autor: Daniel Recio Salcines - info@thephoenixprod.com

Ingeniero técnico en informática de gestión
Mi web: www.thephoenixprod.com

 


Introducción

Hola a todos, voy a explicaros como crear un inputbox (Un formulario que recibe una cadena de texto) para evaluar una contraseña. Este formulario puede emplearse para realizar un login de seguridad (acceso a la aplicación) en los programas que realicemos más adelante.

 

Creando y configurando el nuevo proyecto

Lo primero que debemos hacer es crear un nuevo proyecto, para ello cargamos el compilador de Visual Studio 2005/2008 y hacemos clic en la opción nuevo proyecto.

Seleccionamos 'Aplicación para Windows' y escribimos el nombre de nuestro proyecto, por ejemplo: "MiLogin"

A continuación se cargará el nuevo proyecto con un formulario inicial (por defecto Form1.vb), pulsamos las teclas Ctrl+Mayús+A, para agregar un nuevo formulario o bien vamos al menú: Proyecto > Agregar WindowsForm.

Llamamos al nuevo formulario: inputbox_avz

vamos a las propiedades del formulario e indicamos el tamaño adecuado que queremos que tenga, por ejemplo: 340x170. También desactivamos las opciones: MaximizeBox y MinimizeBox (poniendolas a False). La propiedad StarPosition la configuramos como: CenterScreen y FormBorderStyle como: FixedSingle. Por último agregamos dos labels, dos textbox y dos botones, de forma que tendríamos algo así:

 

Nota:
Lo importante de realizar este ejemplo es comprender la facilidad con la que implementar algo así posteriormente se podrá mejorar este formulario con un mejor diseño para que se adapte mejor a nuestras necesidades y a nuestro proyecto.

 

Configurando los objetos

Lo primero que debemos hacer es dar un nombre significativo a los objetos con los que vamos a interactuar, como son en este ejemplo los dos textbox (cajas de texto) y los dos botones.

Por tanto asignamos al textbox superior el nombre de: t_usuario y a la inferior el nombre de: t_contrasena

En cuanto a los botones el botón de la izquierda será: b_cancelar y el de la derecha: b_aceptar

En la propiedad 'PasswordChar' del textbox: t_contrasena, ponemos de valor: * (un asterisco)

Nota:
Es importante saber dar a los distintos objetos siempre nombres manteniendo una estructura por ejemplo en este caso siempre nombraremos los textbox como t_identificador, mientras que los botones podrían ser b_identificador, esto hará que en un proyecto más complejo sea más fácil distinguir los distintos objetos en el código.

El código

Comenzamos con las declaraciones globales:

Private USER As String = ""  '' Usuario correcto
Private PASSWORD As String = ""  '' Contraseña correcta
Private MAX_TRIES As Integer = 0  '' Máximo número de intentos (Si es < 1 entonces desactivado)
Private CONTADOR As Integer = 1 '' Contador de intentos

A continuación asignamos el código de los eventos (Click) de los botones para ello haz doble click en cada botón y luego reemplaza estos códigos en su ubicación correspondiente.

Private Sub b_cancelar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles b_cancelar.Click
        ''
        Me.DialogResult = Windows.Forms.DialogResult.Cancel
        ''
    End Sub

Private Sub b_aceptar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles b_aceptar.Click
        ''
        If t_usuario.Text = "" Then
            MsgBox("Introduce el nombre de usuario", MsgBoxStyle.Exclamation, "Aviso")
        Else
            If t_contrasena.Text = "" Then
                MsgBox("Introduce la contraseña", MsgBoxStyle.Exclamation, "Aviso")
            Else
                comprobar_datos()
            End If
        End If
        ''
    End Sub

A continuación declaramos un subprocedimiento llamado 'comprobar_datos' en la que evaluaremos si los datos introducidos son correctos:

 Private Sub comprobar_datos()
        ''
        If t_usuario.Text = decodificar(USER) And t_contrasena.Text = decodificar(PASSWORD) Then
            '' Los datos son correctos devolvemos ok al formulario invocador
            Me.DialogResult = Windows.Forms.DialogResult.OK
        Else
            '' Los datos son incorrectos
            If MAX_TRIES > 0 Then
                MsgBox("Los datos introducidos son incorrectos" & Chr(13) & Chr(13) _
                & "Quedan: " & MAX_TRIES - CONTADOR & " intentos", MsgBoxStyle.Critical, "Aviso")
            Else
                MsgBox("Los datos introducidos son incorrectos", MsgBoxStyle.Exclamation, "Aviso")
            End If
            '' Si el valor de intentos máximos es > 0 entonces controlamos los intentos realizados
            If MAX_TRIES > 0 Then
                If CONTADOR = MAX_TRIES Then
                    '' Si el valor del contador es igual al maximo de intentos cerramos el programa
                    Me.DialogResult = Windows.Forms.DialogResult.No
                Else
                    '' Sino aumentamos el contador
                    CONTADOR += 1
                End If
            End If
            ''
        End If
        ''
    End Sub

En este último fragmento estoy haciendo referencia a una función denominada 'decodificar' que esta incluida en el código completo que encontrarás más abajo. Es una función simple pero útil para codificar cadenas de texto fácilmente.

Los valores declarados en mayúsculas son variables globales.

Por último y más importante declaramos otro subprocedimiento denominado 'Inicializar' que será el procedimiento al que haremos referencia al realizar la invocación desde el formulario principal del programa.

  Public Sub Inicializar(ByVal v_user As String, ByVal v_password As String, Optional _
    ByVal v_tries As Integer = 0, Optional ByVal titulo As String = "Login de seguridad")
        ''
        USER = v_user
        PASSWORD = v_password
        MAX_TRIES = v_tries
        Me.Text = titulo
        ''
    End Sub

Podríamos decir que este procedimiento equivale a un constructor de una clase ya que es el encargado de inicializar las variables privadas del formulario.

Los valores recibidos (todos ellos por valor) son el 'nombre de usuario' que tendrá acceso al sistema, la 'contraseña' que le identificará, y como valores opcionales: un valor indicando el número máximo de intentos antes de cerrar el programa (< 1 se considera desactivado) y por último el título que queremos que tenga la ventana de login, que por defecto será: "Login de seguridad"

Ahora vamos de nuevo al formulario principal (Form1) y hacemos doble clic en la barra de titulo del formulario (evento de carga) (Form1_load) e insertamos el siguiente código:

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ''
        Dim FrmSeguridad As New inputbox_avz
        FrmSeguridad.Inicializar("nMRuMwRAKfuqwT", "47258036", 3)
        If FrmSeguridad.ShowDialog <> Windows.Forms.DialogResult.OK Then
            End
        End If
        ''
    End Sub

Al llamar al formulario debemos pasarle el usuario y la contraseña codificados esto es así por que lo normal es que los datos los estemos cargando desde un archivo y se encuentre codificados para evitar un acceso indebido. Nosotros estamos pasando los datos directamente desde el formulario principal (Form1) pero aún así han de estar codificados.

De esta forma, en este ejemplo:

El nombre de usuario: "nMRuMwRAKfuqwT" equivale a "thephoenixprod" y la contraseña "47258036" a "12345678"

 

Codificar los datos

Como los datos deben estar codificados incluyo en el ejemplo otro formulario con un codificador con el que obtener los datos a pasar.

Nota:
El codificador emplea la mismas funciones de seguridad que están en el formulario del inputbox

 

Conclusión

Como veréis resulta muy sencillo mejorar la seguridad de nuestro programa con un inputbox así, ahora lo único que debéis hacer es modificar un poco la interfaz, para adecuarlo a vuestro gusto y/o vuestro programa, además podéis hacer que los datos pasados al formulario provengan directamente de un fichero / archivo o incluso pasar datos de varios usuarios en lugar de uno solo.

Un saludo a todos y espero que os haya servido este ejemplo.

 

Espacios de nombres usados en el código de este artículo:

System.Windows.Forms
System.Drawing
System

 



Compromiso del autor del artículo con el sitio del Guille:

Lo comentado en este artículo está probado (y funciona) con la siguiente configuración:

El autor se compromete personalmente de que lo expuesto en este artículo es cierto y lo ha comprobado usando la configuración indicada anteriormente.

En cualquier caso, el Guille no se responsabiliza del contenido de este artículo.

Si encuentras alguna errata o fallo en algún link (enlace), por favor comunícalo usando este link:

Gracias.


Código de ejemplo (comprimido):

 

Fichero con el código de ejemplo: PhoenixProd_Inputbox_Personalizado.zip - 72.02 KB

(MD5 checksum: 394559F749DACA7495F221889232DEFE)

 


Ir al índice principal de el Guille