none
Encritamiento de strings de passwords RRS feed

  • Pregunta

  • Buenas foro,

    Pues aquí molestando un poco, tengo una duda con respecto a esta clase SHA512Managed, dependiendo de algunos cambios, el hash cambia significativamente, quisiera saber cual formulación es la más segura, como se darán cuenta ni una de las tres tiene las famosas SALTS, me gustaría agregarle esa parte pero pues tengo una fe inocente en que así funcionaría.

    Gracias de antemano.

    Ejercicio 1

    Public Function useSHA512(ByRef input As String) As String
            Dim hexOutput As New StringBuilder()
            Dim sha512 As New SHA512Managed()
            Dim dataToHash As Byte() = Encoding.Unicode.GetBytes(input)
            Dim digest As Byte() = sha512.ComputeHash(dataToHash)
            For i As Integer = 0 To digest.Length - 1
                hexOutput.Append(digest(i).ToString("X"))
            Next
            Return hexOutput.ToString()
        End Function

    Ejercicio 2

    Public Shared Function getEncryptedCode(ByVal inputString As String) As String
            Dim Hash As Byte() = New System.Security.Cryptography.SHA512Managed().ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(inputString))
            Dim outputString As New System.Text.StringBuilder()
            For i As Integer = 0 To Hash.Length - 1
                outputString.Append(Hash(i).ToString("x2"))
            Next
            Return outputString.ToString()
        End Function

    Ejercicio 3

      Private Function SHA512(ByVal SText As String) As String
            Dim a() As Byte = Encoding.UTF8.GetBytes(SText)
            Dim b As Byte()
            Dim c As New SHA512Managed()
            b = c.ComputeHash(a)
    
            Dim d As String = Convert.ToBase64String(b)
            Return d
        End Function

    • Cambiado Sergio Parra sábado, 28 de noviembre de 2015 5:44 consulta sobre encriptacion vb
    viernes, 27 de noviembre de 2015 19:51

Respuestas

  • "jonsey10" preguntó:

    > ... como se darán cuenta ni una de las tres tiene las famosas SALTS,
    > me gustaría agregarle esa parte ...

    Hola:

    Para añadirle "las famosas SALTS", tendrás que añadirle un parámetro de entrada extra a tus funciones para especificar la contraseña con la que se derivará el valor de la cadena alfanumérica cuyo resumen hash deseas obtener, tal y como muestra la siguiente función:

        Public Shared Function GetHash(text As String, password As String) As String
    
            ' Verificación de parámetros.
            '
            If ((String.IsNullOrEmpty(password)) OrElse (password.Length < 8)) Then
                Throw New ArgumentException("La contraseña especificada tiene menos de ocho caracteres.")
            End If
    
            If (String.IsNullOrEmpty(text)) Then
                ' No se ha especificado texto alguno.
                Return String.Empty
            End If
    
            Dim base64 As String = String.Empty
            Dim key As Byte()
    
            ' Obtenemos una matriz de bytes correspondiente a la contraseña especificada
            ' cuyo valor actuará de valor salt para derivar el texto.
            '
            Dim salt As Byte() = Encoding.UTF8.GetBytes(password)
    
            Try
                ' Derivamos el valor del texto con el valor salt obtenido de la contraseña.
                '
                Using rfc As New Rfc2898DeriveBytes(text, salt, 1000)
                    key = rfc.GetBytes(16)
                End Using
    
                Using sha512 As New SHA512Managed()
                    ' Calculamos el resumen hash y lo convertimos a base 64.
                    base64 = Convert.ToBase64String(sha512.ComputeHash(key))
                End Using
    
            Finally
                ' Liberamos los valores de las matrices utilizadas.
                Erase key, salt
    
            End Try
    
            ' Devolvemos el valor en base 64.
            Return base64
    
        End Function

    En principio al parámetro password le tendrás que especificar una cadena alfanumérica con una longitud mínima de 8 caracteres. Por supuesto que le puedes establecer una longitud inferior a 8, aunque tampoco es muy recomendable que digamos. Cuando desees obtener el resumen hash de un texto cualquiera, llamarías a la función de la siguiente manera:

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            Try
                txtResumenHash.Text = GetHash(TextBox1.Text, "contraseña")
    
            Catch ex As Exception
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub

    Observa que a diferentes valores de contraseña se obtendrán valores distintos para la misma cadena alfanumérica especificada. Ello quiere decir que mientras que el valor de la contraseña no sea de "dominio público", todo irá bien, pero si no es así, cualquiera podrá obtener el valor del resumen hash correspondiente a cualquier valor alfanumérico dado, utilices SHA1, SHA256 o SHA512. ;-)

    > se dice que el SHA1 ya es muy -crakeable- o -hackeable-, y que este
    > algoritmo SHA512 primo-hermano del primero es mucho más seguro

    Digamos que con la tecnología existente hoy en día, el algoritmo SHA1 ha pasado a estar obsoleto, ya que por técnicas de fuerza bruta su valor se puede obtener en un período de tiempo más corto.

    Se reduce la complejidad para provocar colisiones en SHA1

    Fíjate en la fecha en la que fue publicado el artículo: 14/06/2009.

    Hoy en día se recomienda utilizar algoritmos de hash criptográficos cuyo valor hash tenga una longitud superior a los 160 bits que tiene el algoritmo SHA1, como el SHA256 (256 bits), o el que tú has elegido, el SHA512, cuyo hash tiene una longitud de 512 bits.

    Un saludo


    Enrique Martínez Montejo
            [MS MVP - VB]

    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.


    sábado, 28 de noviembre de 2015 16:28
    Moderador

Todas las respuestas

  • hola

    en que todo este codigo terminas haciendo lo mismo

    usas el SHA512 y aplicas un ComputeHash() en todos los casos

    despues le varias como representas el resultado final, a uno le aplcias un ToString() a otro lo convierte a base64, pero si es por tema de seguridad lo que preocupa todos son iguales porque el hash usa el mismo algoritmo en todos los casos

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 27 de noviembre de 2015 20:54
  • Leandro,

    Gracias por tus comentarios, solamente una duda más, por todo lo que he leído, se dice que el SHA1 ya es muy -crakeable- o -hackeable-, y que este algoritmo SHA512 primo-hermano del primero es mucho más seguro, y que la longitud del hash es indiferente, que tanto desde tu perspectiva esto es cierto.

    Saludos.

    viernes, 27 de noviembre de 2015 21:02
  • "jonsey10" preguntó:

    > ... como se darán cuenta ni una de las tres tiene las famosas SALTS,
    > me gustaría agregarle esa parte ...

    Hola:

    Para añadirle "las famosas SALTS", tendrás que añadirle un parámetro de entrada extra a tus funciones para especificar la contraseña con la que se derivará el valor de la cadena alfanumérica cuyo resumen hash deseas obtener, tal y como muestra la siguiente función:

        Public Shared Function GetHash(text As String, password As String) As String
    
            ' Verificación de parámetros.
            '
            If ((String.IsNullOrEmpty(password)) OrElse (password.Length < 8)) Then
                Throw New ArgumentException("La contraseña especificada tiene menos de ocho caracteres.")
            End If
    
            If (String.IsNullOrEmpty(text)) Then
                ' No se ha especificado texto alguno.
                Return String.Empty
            End If
    
            Dim base64 As String = String.Empty
            Dim key As Byte()
    
            ' Obtenemos una matriz de bytes correspondiente a la contraseña especificada
            ' cuyo valor actuará de valor salt para derivar el texto.
            '
            Dim salt As Byte() = Encoding.UTF8.GetBytes(password)
    
            Try
                ' Derivamos el valor del texto con el valor salt obtenido de la contraseña.
                '
                Using rfc As New Rfc2898DeriveBytes(text, salt, 1000)
                    key = rfc.GetBytes(16)
                End Using
    
                Using sha512 As New SHA512Managed()
                    ' Calculamos el resumen hash y lo convertimos a base 64.
                    base64 = Convert.ToBase64String(sha512.ComputeHash(key))
                End Using
    
            Finally
                ' Liberamos los valores de las matrices utilizadas.
                Erase key, salt
    
            End Try
    
            ' Devolvemos el valor en base 64.
            Return base64
    
        End Function

    En principio al parámetro password le tendrás que especificar una cadena alfanumérica con una longitud mínima de 8 caracteres. Por supuesto que le puedes establecer una longitud inferior a 8, aunque tampoco es muy recomendable que digamos. Cuando desees obtener el resumen hash de un texto cualquiera, llamarías a la función de la siguiente manera:

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            Try
                txtResumenHash.Text = GetHash(TextBox1.Text, "contraseña")
    
            Catch ex As Exception
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub

    Observa que a diferentes valores de contraseña se obtendrán valores distintos para la misma cadena alfanumérica especificada. Ello quiere decir que mientras que el valor de la contraseña no sea de "dominio público", todo irá bien, pero si no es así, cualquiera podrá obtener el valor del resumen hash correspondiente a cualquier valor alfanumérico dado, utilices SHA1, SHA256 o SHA512. ;-)

    > se dice que el SHA1 ya es muy -crakeable- o -hackeable-, y que este
    > algoritmo SHA512 primo-hermano del primero es mucho más seguro

    Digamos que con la tecnología existente hoy en día, el algoritmo SHA1 ha pasado a estar obsoleto, ya que por técnicas de fuerza bruta su valor se puede obtener en un período de tiempo más corto.

    Se reduce la complejidad para provocar colisiones en SHA1

    Fíjate en la fecha en la que fue publicado el artículo: 14/06/2009.

    Hoy en día se recomienda utilizar algoritmos de hash criptográficos cuyo valor hash tenga una longitud superior a los 160 bits que tiene el algoritmo SHA1, como el SHA256 (256 bits), o el que tú has elegido, el SHA512, cuyo hash tiene una longitud de 512 bits.

    Un saludo


    Enrique Martínez Montejo
            [MS MVP - VB]

    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.


    sábado, 28 de noviembre de 2015 16:28
    Moderador