** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - HASH de un String
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoHASH de un String

 Responder Responder
Autor
Mensaje
thrall Ver desplegable
Nuevo
Nuevo
Avatar

Unido: 04/Agosto/2020
Localización: mexico
Estado: Sin conexión
Puntos: 21
Enlace directo a este mensaje Tema: HASH de un String
    Enviado: 11/Agosto/2020 a las 17:41
Buen día:

En la aplicación que estoy realizando, es necesario tener usuario y contraseña para poder acceder a los formularios. Tengo ya programada toda la parte del login, incluso haciendo un HASH SHA512 del password que almaceno en una tabla y es el que uso para comparar con el password al momento de realizar el login.

Les pongo el código que utilizo para realizar el HASH, el cual mando llamar desde el formulario login con:
b64 = True
        sH = SHA512(txtPwd.Value, b64)

El cual llama la funcion SHA512:

Public Function SHA512(sIn As String, Optional bB64 As Boolean = 0) As String
    'Set a reference to mscorlib 4.0 64-bit
    
    'Test with empty string input:
    '128 Hex:   cf83e1357eefb8bd...etc
    '88 Base-64:   z4PhNX7vuL3xVChQ...etc
    
    Dim oT As Object, oSHA512 As Object
    Dim TextToHash() As Byte, bytes() As Byte
    
    Set oT = CreateObject("System.Text.UTF8Encoding")
    Set oSHA512 = CreateObject("System.Security.Cryptography.SHA512Managed")
    
    TextToHash = oT.GetBytes_4(sIn)
    bytes = oSHA512.ComputeHash_2((TextToHash))
    
    If bB64 = True Then
       SHA512 = ConvToBase64String(bytes)
    Else
       SHA512 = ConvToHexString(bytes)
    End If
    
    Set oT = Nothing
    Set oSHA512 = Nothing
    
End Function

y las funciones para convertir a base hexadecimal o cadena de caracteres:

Private Function ConvToBase64String(vIn As Variant) As Variant

    Dim oD As Object
      
    Set oD = CreateObject("MSXML2.DOMDocument")
      With oD
        .LoadXML "<root />"
        .DocumentElement.DataType = "bin.base64"
        .DocumentElement.nodeTypedValue = vIn
      End With
    ConvToBase64String = Replace(oD.DocumentElement.Text, vbLf, "")
    
    Set oD = Nothing

End Function

Private Function ConvToHexString(vIn As Variant) As Variant

    Dim oD As Object
      
    Set oD = CreateObject("MSXML2.DOMDocument")
      
      With oD
        .LoadXML "<root />"
        .DocumentElement.DataType = "bin.Hex"
        .DocumentElement.nodeTypedValue = vIn
      End With
    ConvToHexString = Replace(oD.DocumentElement.Text, vbLf, "")
    
    Set oD = Nothing

End Function


El problema es que para poder utilizar estas es necesario tener .Net Framework 3.5 instalado, pero en los equipos donde se quiere distribuir la base, es muy probable que no lo tenga instalado.

¿Hay alguna manera de realizar el HASH sin utilizar librerías de .Net o en su defecto utilizar librerías de .Net "nativo" en windows 10? o bien ¿alguna manera de verificar si está está instalado el .Net 3.5 y en caso de que no esté, lazar la instalación desde codigo vba?

Sin más por el momento, agradezco enormemente su ayuda.

Saludos.


Editado por thrall - 11/Agosto/2020 a las 21:03
Arriba
thrall Ver desplegable
Nuevo
Nuevo
Avatar

Unido: 04/Agosto/2020
Localización: mexico
Estado: Sin conexión
Puntos: 21
Enlace directo a este mensaje Enviado: 11/Agosto/2020 a las 21:03
Que tal, investigando y haciendo pruebas con diferentes códigos e ideas, encontré una solución que tal vez no sea la más eficaz o eficiente, sin embargo, realiza lo que necesito y sin necesidad de tener componentes adicionales instalados.

La solución: utilizar las funciones de HASH implícitas en SQL, para mi caso utilizo:

SELECT SHA512("Cadena") AS SHA512

El valor devuelto lo guardo en la tabla de usuarios que después utilizaré para verificar que sea el mismo password.

Saludos
Arriba
javier.mil Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 10/Agosto/2005
Localización: España
Estado: Sin conexión
Puntos: 4830
Enlace directo a este mensaje Enviado: 11/Agosto/2020 a las 22:59
Buenas , pero usar un HASH512 para encriptar passwords y guardarlos en un Tabla la Access ???.....
me parece un poco excesivo ,......... pero vamos esa es un opinión muy personal,....... cualquiera (con un poco conocimiento) desde fuera (externamente) puede colocar en tu tabla de Access un usuario con su correspondiente password hasheado ..... y tendría acceso a tu base ........ solo necesitan saber que usas HASH512 para tener éxito .......
Arriba
thrall Ver desplegable
Nuevo
Nuevo
Avatar

Unido: 04/Agosto/2020
Localización: mexico
Estado: Sin conexión
Puntos: 21
Enlace directo a este mensaje Enviado: 11/Agosto/2020 a las 23:43
Javier.mil, estoy totalmente de acuerdo contigo al respecto de que cualquiera con un poco de conocimiento y sabiendo que se utiliza un password cifrado con HASH512 o 256 o MD5 puede colocar un usuario que cumpla con las condiciones requeridas.

Sin embargo, la idea detrás de poner un HASH es no tener el password plano en una tabla. Se que tal vez sea excesivo y no sea lo más adecuado tener los usuarios en la misma BD que los datos, pero como la base no va a estar en un entorno LAN solo LOCAL se pensó en esta solución, que bien se pudo crear incluso una función que hiciera solo un SHIFT de caracteres y listo. 

Agradezco enormemente tu comentario, el cual tomaré muy en cuenta para próximos desarrollos.

Saludos.
Arriba
javier.mil Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 10/Agosto/2005
Localización: España
Estado: Sin conexión
Puntos: 4830
Enlace directo a este mensaje Enviado: 12/Agosto/2020 a las 09:31
A ver prueba a ver si es esto lo que necesitas , el codigo es prácticamente el mismo pero creo que funciona sin necesidad de tener  .Net Framework 3.5 instalado


Private Sub KK()
    Debug.Print funSHA512("Hola Mundo")
    MsgBox funSHA512("Hola Mundo"), vbInformation, "SHA512 by javier.mil"

    MsgBox "Fin"
End Sub



Public Function funSHA512(PonCadena As String) As String

    Dim objText As Object
    Dim objSHA512 As Object

    Dim arrTextToHash() As Byte
    Dim arrbytes() As Byte

    Set objText = CreateObject("System.Text.UTF8Encoding")
    Set objSHA512 = CreateObject("System.Security.Cryptography.SHA512Managed")

    arrTextToHash = objText.GetBytes_4(PonCadena)
    arrbytes = objSHA512.ComputeHash_2((arrTextToHash))

    funSHA512 = UCase(funConvToHexString(arrbytes))

Close_Local:
    Set objText = Nothing
    Set objSHA512 = Nothing

End Function

Public Function funConvToHexString(PonBin As Variant) As Variant

    On Error Resume Next

    Dim objDom As Object

    Set objDom = CreateObject("MSXML2.DOMDocument.6.0")

    With objDom
        .loadXML "<root />"
        .documentElement.DataType = "bin.Hex"  ' << SHA512
        .documentElement.nodeTypedValue = PonBin
    End With
    funConvToHexString = Replace(objDom.documentElement.text, vbLf, "")

Close_Local:
    Set objDom = Nothing

End Function


pruebalo y ya contaras ,.......

 



Editado por javier.mil - 12/Agosto/2020 a las 09:45
Arriba
javier.mil Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 10/Agosto/2005
Localización: España
Estado: Sin conexión
Puntos: 4830
Enlace directo a este mensaje Enviado: 12/Agosto/2020 a las 10:08
Ahhh creo que si utilizas tu codigo deberia cambiar


b64 = True
        sH = SHA512(txtPwd.Value, b64)
b64 = False
        sH = SHA512(txtPwd.Value, b64)


Si esta a True codifica a Base64
Si esta a False Hashea a Hash512

Arriba
lbauluz Ver desplegable
Administrador
Administrador
Avatar

Unido: 29/Marzo/2005
Localización: La Gloria
Estado: Sin conexión
Puntos: 3861
Enlace directo a este mensaje Enviado: 12/Agosto/2020 a las 14:50
Y ¿por qué no añadir a la cadena de la clave del usuario otra "clave fija" y después encriptarlo?

Así, cualquiera que no conozca esa clave fija no podrá añadir nada a la tabla... o podrá añadir, pero no le funcionará, que es de lo que se trata

Es decir si mi clave es 1234  y la clave fija es qwerty lo que tengo que hacer es juntarlas en 1234qwert y encriptar.

Luis
El Búho es un pajarraco
Arriba
guarracuco Ver desplegable
Moderador
Moderador


Unido: 24/Abril/2004
Localización: EEUU
Estado: Sin conexión
Puntos: 3239
Enlace directo a este mensaje Enviado: 13/Agosto/2020 a las 23:50
Ibauluz, hace un par de años o más, plantee un reto de hackear cuentas de usuario, aplicando lo que indicas. En mi caso utilizaba 3 columnas del usuario para llenar otra con MD5, la cual es comparada al iniciar sesión el usuario. Un proceso al inicio de sesión recrea el token y lo compara con el almacenado para el usuario. Es decir, con la tabla de usuario a la vista, por más que copies la clave o el token del admin y lo pegues en otro usuario, te va a pasar la prueba en el proceso de login. Un proceso se puede disparar regularmente para ubicar incongruencias.
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable