none
Desencriptada contraseña en consulta sql

    Pregunta

  • buenas a todos

    programa en vb.net

    tengo una funcion que encripta la contraseña en la tabla ususario: 

    Imports System.Text
    Imports System.Security.Cryptography
    Public Class Encriptar
        Public Shared Function MD5(ByVal input As String) As String
            Dim hash As New StringBuilder()
            Dim md5provider As New MD5CryptoServiceProvider()
            Dim bytes As Byte() = md5provider.ComputeHash(New UTF8Encoding().GetBytes(input))
    
            For i As Integer = 0 To bytes.Length - 1
                hash.Append(bytes(i).ToString("x2"))
            Next
            Return hash.ToString()
        End Function
    
    End Class

    La función funciona nítido, cuando guardo un registro usuario y entro la tabla Usuario en modo editar en sql se guardan un serie de letras, es decir funciona bien. 

    pero tengo una consulta sql y quiero que la contraseña me cargue Desencriptada

     DsPersonas = miclase.TraeDataset("SELECT Codigo_Usuario, Nom_Usu, Con_usu FROM Tbla_Usuario WHERE Codigo_Usuario=" & txtCod_Usu.Text & "")
            If DsPersonas.Tables(0).Rows.Count > 0 Then
    
    
                'txtCodigo.Text = DsPersonas.Tables(0).Rows(0).Item(0).ToString
    
               
                txtNom_Usu.Text = DsPersonas.Tables(0).Rows(0).Item(1).ToString
                txtUsu_Contrasena.Text = DsPersonas.Tables(0).Rows(0).Item(2).ToString

    esta consulta carga los datos al formulario, pero quiero que la contraseña me cargue Desencriptada


    • Editado EliannyRD viernes, 25 de noviembre de 2016 19:48
    viernes, 25 de noviembre de 2016 19:46

Respuestas

  • "EliannyRD" escribió:

    > tengo una funcion que encripta la contraseña en la tabla ususario ...
    > pero tengo una consulta sql y quiero que la contraseña me cargue Desencriptada.

    Hola:

    Entiendo que una contraseña encriptada en la base de datos NO DEBERÍA SER DESENCRIPTADA de ninguna manera, porque con ello estarías abriendo un agujero de seguridad en tu programa si permites que la contraseña del usuario pueda ser leía como texto plano.

    ¿De que sirve que yo me caliente la cabeza para establecer una contraseña de 50 caracteres si tu programa es capaz de averiguar la contraseña que yo he establecido? ¿Te gustaría a ti que cualquier servicio de los múltiples y famosos que pululan por Internet, fuera capaz de conocer la contraseña que has escrito para entrar en el sistema? A mí, desde luego que no me gustaría. ;-)

    Tu tienes que guardar en la base de datos un resumen hash de la contraseña que ha establecido el usuario a la hora de registrarse de tal manera que NO SEA POSIBLE obtener el texto plano mediante la lectura del resumen hash almacenado. Pero si ese valor puede ser desencriptado, cualquiera que acceda a la base de datos podría obtener la contraseña de todos los usuarios existentes en la tabla Usuario de tu base de datos. ¡Menudo chollo iban a tener los hackers si son capaces de acceder a esa base de datos! ;-)

    > DsPersonas = miclase.TraeDataset("SELECT Codigo_Usuario, Nom_Usu, Con_usu
    > FROM Tbla_Usuario WHERE Codigo_Usuario=" & txtCod_Usu.Text & "")
     
    Ahora, la pregunta sería, ¿para qué quiere tu programa conocer la contraseña desencriptada de un usuario?

    Una contraseña se utiliza únicamente para autentificar a una persona al inicio del programa, para verificar que un usuario es quién dice ser. Pero una vez que se ha autentificado en el sistema, para nada te debería de servir conocer el texto plano de la contraseña del usuario. Al menos, así es como yo lo entiendo. ;-)

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    viernes, 25 de noviembre de 2016 20:25
    Moderador

Todas las respuestas

  • Hola EliannyRD deberías tener también la función para desencriptar en ese caso:

     Private des As New TripleDESCryptoServiceProvider
        Private hashmd5 As New MD5CryptoServiceProvider 
        Private myKey As String = "keyPropia" 
     
    'Funcion para el Encriptado de Cadenas de Texto
    Private Function Encriptar(ByVal texto As String) As String
             
            If Trim(texto) = "" Then
                Encriptar = ""
            Else
                des.Key = hashmd5.ComputeHash((New UnicodeEncoding).GetBytes(myKey))
                des.Mode = CipherMode.ECB
                Dim encrypt As ICryptoTransform = des.CreateEncryptor()
                Dim buff() As Byte = UnicodeEncoding.ASCII.GetBytes(texto)
                Encriptar = Convert.ToBase64String(encrypt.TransformFinalBlock(buff, 0, buff.Length))
            End If
            Return Encriptar
    End Function
     
     
    'Funcion para el Desencriptado de Cadenas de Texto
    Private Function Desencriptar(ByVal texto As String) As String
            If Trim(texto) = "" Then
                Desencriptar = ""
            Else
                des.Key = hashmd5.ComputeHash((New UnicodeEncoding).GetBytes(myKey))
                des.Mode = CipherMode.ECB
                Dim desencrypta As ICryptoTransform = des.CreateDecryptor()
                Dim buff() As Byte = Convert.FromBase64String(texto)
                Desencriptar = UnicodeEncoding.ASCII.GetString(desencrypta.TransformFinalBlock(buff, 0, buff.Length))
            End If
            Return Desencriptar
    End Function

    En este ejemplo están las dos funciones (Encripta y Desencripta) 

     ahora deberías aplicarlo a tu código:

    DsPersonas = miclase.TraeDataset("SELECT Codigo_Usuario, Nom_Usu, Con_usu FROM Tbla_Usuario WHERE Codigo_Usuario=" & txtCod_Usu.Text & "")
            If DsPersonas.Tables(0).Rows.Count > 0 Then
    
    
                txtCodigo.Text = DsPersonas.Tables(0).Rows(0).Item(0).ToString
    
                txtCod_Usu.Text = DsPersonas.Tables(0).Rows(0).Item(0).ToString
                txtNom_Usu.Text = DsPersonas.Tables(0).Rows(0).Item(1).ToString
                txtUsu_Contrasena.Text = Desencriptar(DsPersonas.Tables(0).Rows(0).Item(2).ToString)

    tu TxtUsua_Contrasena será igual a la contraseña desencriptada.

    Saludos y suerte!


    Javier

    viernes, 25 de noviembre de 2016 19:53
  • Gracias por contestar. 

    la función me quedó así: 

    Imports System.Text
    Imports System.Security.Cryptography
    Public Class Desencriptar
        Private des As New TripleDESCryptoServiceProvider
        Private hashmd5 As New MD5CryptoServiceProvider
        Private myKey As String = "keyPropia"
        'Funcion para el Desencriptado de Cadenas de Texto
        Private Function Desencriptar(ByVal texto As String) As String
            If Trim(texto) = "" Then
                Desencriptar = ""
            Else
                DES.Key = hashmd5.ComputeHash((New UnicodeEncoding).GetBytes(myKey))
                DES.Mode = CipherMode.ECB
                Dim desencrypta As ICryptoTransform = DES.CreateDecryptor()
                Dim buff() As Byte = Convert.FromBase64String(texto)
                Desencriptar = UnicodeEncoding.ASCII.GetString(desencrypta.TransformFinalBlock(buff, 0, buff.Length))
            End If
            Return Desencriptar
        End Function
    End Class

    pero sale este error.

    viernes, 25 de noviembre de 2016 20:20
  • "EliannyRD" escribió:

    > tengo una funcion que encripta la contraseña en la tabla ususario ...
    > pero tengo una consulta sql y quiero que la contraseña me cargue Desencriptada.

    Hola:

    Entiendo que una contraseña encriptada en la base de datos NO DEBERÍA SER DESENCRIPTADA de ninguna manera, porque con ello estarías abriendo un agujero de seguridad en tu programa si permites que la contraseña del usuario pueda ser leía como texto plano.

    ¿De que sirve que yo me caliente la cabeza para establecer una contraseña de 50 caracteres si tu programa es capaz de averiguar la contraseña que yo he establecido? ¿Te gustaría a ti que cualquier servicio de los múltiples y famosos que pululan por Internet, fuera capaz de conocer la contraseña que has escrito para entrar en el sistema? A mí, desde luego que no me gustaría. ;-)

    Tu tienes que guardar en la base de datos un resumen hash de la contraseña que ha establecido el usuario a la hora de registrarse de tal manera que NO SEA POSIBLE obtener el texto plano mediante la lectura del resumen hash almacenado. Pero si ese valor puede ser desencriptado, cualquiera que acceda a la base de datos podría obtener la contraseña de todos los usuarios existentes en la tabla Usuario de tu base de datos. ¡Menudo chollo iban a tener los hackers si son capaces de acceder a esa base de datos! ;-)

    > DsPersonas = miclase.TraeDataset("SELECT Codigo_Usuario, Nom_Usu, Con_usu
    > FROM Tbla_Usuario WHERE Codigo_Usuario=" & txtCod_Usu.Text & "")
     
    Ahora, la pregunta sería, ¿para qué quiere tu programa conocer la contraseña desencriptada de un usuario?

    Una contraseña se utiliza únicamente para autentificar a una persona al inicio del programa, para verificar que un usuario es quién dice ser. Pero una vez que se ha autentificado en el sistema, para nada te debería de servir conocer el texto plano de la contraseña del usuario. Al menos, así es como yo lo entiendo. ;-)

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    viernes, 25 de noviembre de 2016 20:25
    Moderador
  • Parece que la función desencriptar esta privada, por eso no puedes acceder a ella.

    Javier

    viernes, 25 de noviembre de 2016 20:45
  • Gracias

    Enrique M. Montejo

    comprendo,

    ademas gracias Javier por tu interés 

    viernes, 25 de noviembre de 2016 21:08