Será más difícil eliminar un hash sin saber la función de hash utilizada. Tendrás que adivinar tanto la función de hash como los datos de hash. Sin embargo, no hay razón para mantener en secreto la función hash.
Primero, generalmente es bastante evidente a partir de la longitud del hash (o al configurar una cuenta ficticia y probar muchas posibilidades obvias) qué algoritmo se usó para generarla. En general, es una mala idea modificar las funciones hash existentes para "rodar su propia" función hash, ya que (1) es innecesario, (2) será una pesadilla para mantener en varios sistemas, (3) si se hace mal, puede debilitar drásticamente la seguridad y (4) la forma en que se calcula la función hash estará en el código fuente / ejecutable y un atacante determinado que comprometa la lista de hashes, también podrá obtener el código fuente / ejecutable y podrá aplicar ingeniería inversa a la función hash desde allí.
Si realmente desea ir por la ruta en la que el hash no debe ser de fuerza bruta (hasta que comprometa el código fuente de la aplicación o el ejecutable), no debe usar un hash sino que debe usar un MAC (Código de autenticación de mensajes) . Puede construir un MAC a partir de una función hash utilizando el construcción HMAC : HMAC(password) = H(K1 ++ H(K2 ++ password))
donde H
es una función hash, K
es una clave secreta (almacenada en la aplicación que calcula la HMAC), K1 = K XOR 0x5c5c...5c
y K2 = K XOR 0x3636...36
son dos claves secretas diferentes derivadas de K (donde 0x5c5c...5c
y 0x3636...36
es un bloque del byte 0x5c
o 0x36
repetido con la misma longitud que la clave secreta). Entonces, si tiene una clave secreta de 256 bits y utiliza SHA-256 como su función hash, hay aproximadamente 2 256 claves HMAC potenciales (~ 10 77 - para comparación solo ha habido unos 10 26 nanosegundos desde el Big Bang) que un atacante tendría que recorrer antes de encontrar el K utilizado (si de hecho encuentran el K correcto y no una colisión improbable que funcione para uno contraseña específica pero no otras).
Los MAC generalmente se usan para verificar la integridad del mensaje (en el sentido de que solo alguien con la clave secreta puede generar un MAC válido) y no para almacenar contraseñas / usuarios de autenticación, pero no hay razón para que no puedan usarse con este fin. El problema es el mismo: no desea que alguien que haya obtenido un mensaje y el hash asociado (MAC), pueda crear nuevos hashes (MAC) para otros mensajes (como parte de un ataque de fuerza bruta). Se cree que los MAC tienen seguridad contra este ataque; mientras que elegir un esquema aleatorio complicado como SHA1(SHA512(pw)++SHA256(MD5(pw)++MD4(pw)))
es en principio mucho más fácil de adivinar para un atacante que una clave aleatoria de 256 bits (y es más probable que se escape de algún tipo de ataque de canal lateral).
Concedido usando un MAC es probablemente una exageración. Si utiliza contraseñas seguras y un hash salado reforzado con clave moderno (bcrypt, PBKDF, SHA512crypt), simplemente no es posible forzar la fuerza bruta.