Esta función te permite comprobar la contraseña de un usuario contra una base de datos sin necesidad de conocerla. El proceso inverso no es posible.
La función está basada en otras que he recopilado por internet y he adecuado a los sistemas de información de mi empresa. Es correcta y cumple la ley de protección de datos ya que el administrador no conocerá la contraseña del usuario y queda almacenada en formato ilegible.
Desde que este algoritmo fue público, los usuarios deben evitar el uso de palabras individuales como contraseñas, ya que un programa “cracker” podría iniciar un bucle a través de un diccionario ortográfico y aplicar esta función para tratar de coincidir con el valor hashed. Para mas seguridad los usuarios deberían utilizar por lo menos dos palabras, y tal vez utilizar dígitos y signos de puntuación en la contraseña. Ya sabéis que a los hackers hay que ponérselo lo mas difícil posible, estas recomendaciones se las hago a mis usuarios pero otra cosa es que me hagan caso, seguro que unos cuantos de ellos tienen el nombre del marido o del hijo como contraseña.
Su uso se hace enviándole el usuario y la contraseña a la función para que te devuelva el valor hash y se contrasta con el valor almacenado en la base de datos.
Función:
Function HashPassword(ByVal vsUserId As String, ByVal vsPassword As String) As Double
Const uHASH_DEPTH = 6
Static k(uHASH_DEPTH) As Integer
Dim S As String
Dim I As Integer
Dim J As Integer
Dim k1 As Integer
Dim N As Integer
Dim fHash As Double
Dim fTemp As Double
‘ Si la contraseña está en blanco,
‘ el valor de hash sigue siendo cero.
‘ Por lo tanto significa “sin contraseña”.
fHash = 0#
If vsPassword <> “” Then
‘ Si incluyes el nombre del usuario como parte del hash,
‘ dos usuarios con la misma contraseña no tendrán el mismo
‘ valor de hash:
S = vsPassword & vsUserId
‘s = UCase$(s) ‘ Activa esta linea para convertir a mayúsculas
N = Len(S)
k(1) = Asc(Mid$(S, 1, 1))
For J = 2 To uHASH_DEPTH
k1 = 1 + (k(J – 1) Mod N)
k(J) = Asc(Mid$(S, k1, 1))
If k(J) = k(J – 1) Then
k(J) = k(J) + 1
End If
Next J
For I = 1 To N
fTemp = I
For J = 1 To uHASH_DEPTH
k1 = 1 + ((I + k(J)) Mod N)
fTemp = fTemp * Asc(Mid$(S, k1, 1))
Next J
fHash = fHash + fTemp
Next I
End If
HashPassword = fHash
End Function
Uso de la función en el programa:
En la siguiente linea se hace una comparación entre la cadena hash que se supone que tenemos almacenada en la base de datos y la que ha tecleado el usuario.
bPwdOk es un boleano que nos dice si coincide el hash que tenemos almacenado en nuestra base de datos con el que ha tecleado el usuario.
bPwdOk = (StrComp(tabla!Pwd, HashPassword(txtUsuario.Text, txtPwd.Text), vbTextCompare) = 0)
- tabla!pwd : campo que hemos obtenido a través de un recordset de la base de datos en la que está almacenado el valor hash de la contraseña del usuario.
- txtUsuario.text : valor de la caja de texto del UserId, en el caso del gráfico D-SUAREZ.
- txtPwd.text : el valor de la caja de texto que contiene la contraseña que ha escrito el usuario.
Comentarios Recientes