Sobre los dos propuestos -
function (salt, pass) { return
(StrongHash( StrongHash(salt) + StrongHash(pass) )
}
No hay bonus aquí. Un hash convierte la información en algo aleatorio. Así que en la primera pasada, hizo dos partes de datos en dos cadenas aleatorias y luego combinó dos cadenas aleatorias. ¿Por qué? La seguridad a través de la oscuridad no ofrece ningún beneficio. Los elementos críticos de la solución generalmente propuesta son:
- combinar sal y amp; contraseña para que el salt pueda proporcionar un factor de caos adicional para crear el hash de una contraseña
- de una manera hash el conglomerado para hacer una cadena aparentemente aleatoria.
No puede ser más aleatorio que aleatorio, y con seguridad es bueno evitar el trabajo que no tiene un propósito.
function (salt, pass) {
var data = salt + pass;
for (i=0;i < 1000; i++ {
data += StrongHash(salt + data)
}
return (data)
}
Lo primero que sucede aquí es que a los datos se les proporciona el salt y la contraseña. Por lo que su salida se verá como:
<Salt><Password><randomString0><randomString1>....<randomString999>
<Salt> = the salt in cleartext
<Password> = the password in cleartext
<randomString> = a series of different random strings.
El código tal como está escrito acaba de exponer la contraseña, por lo que todas las cadenas aleatorias no tienen ningún propósito.
Una solución a este problema sería:
function (salt, pass) {
var data = salt + pass;
for (i=0;i < 1000; i++ {
data = StrongHash(salt + data)
}
return (data)
}
Observe la eliminación de + = y cambie a una tarea simple. Es un pequeño cambio, pero significa que ahora sus datos finales son una sola cadena aleatoria de la longitud que genera su algoritmo hash.
Probablemente esté bien desde el punto de vista de la seguridad, pero, una vez más, no hay una mejora real con respecto a la versión original simple. La repetición de muchos hash recursivos no agrega seguridad: su primera pasada con un algoritmo de hash debería producir un resultado aleatorio. Hashear lo mismo una y otra vez no hace nada en el mejor de los casos, y el peor de los casos podría terminar reduciendo el valor del algoritmo hash.
La primera forma ofrece un beneficio muy importante: el director de KISS. Mantenlo simple. Cuando repetir la función no ofrece beneficios, no hay razón para hacer que su lógica sea más complicada, más larga de procesar, más abierta al error y más difícil de depurar.
También: con la criptografía, todos los algoritmos deben venir con un manual de usuario que llene su cubículo promedio. La discusión sobre las teclas débiles, los problemas con la repetición, la exposición y otros debates de entrada / salida matemática mantendrá a los matemáticos llenos de temas de tesis por el resto de la eternidad. Hasta que no haya un algoritmo específico en juego, es difícil discutir las repercusiones reales, pero en general es una buena política dejar las repeticiones y permutaciones hasta el diseño del algoritmo en lugar de intentar ayudar. Muchos algoritmos hash ya tienen ciclos de repetición y recursión, lo que significa que el usuario no tiene motivos para hacer más.