La división de la contraseña es mala.
El diseño de su propio mecanismo de hashing de contraseñas tampoco es bueno. Está bien para fines de aprendizaje, pero para la producción, esto es un no-go, porque no puede saber si hizo las cosas bien o no . Es un defecto genérico y global de la criptografía casera. De toda la criptografía, en realidad; pero, al menos, con estándares públicos como bcrypt , se beneficia de la revisión de muchos ojos durante muchos años.
Dices que los atacantes "no sabrán el tipo de hash que usaste". Eso está mal; Ya lo saben, probablemente mejor que tú. En primer lugar, tienen acceso a Internet, por lo que pueden leer esta pregunta que hacen en StackExchange. Además, el método de hashing existe como código fuente en algún lugar, y algún script ejecutable o binario en su servidor, por lo que no puede ser realmente secreto. En particular, desea hacer un hash de las contraseñas antes de almacenarlas porque imagina que un atacante podría obtener un acceso de solo lectura ilegal a los datos almacenados por el servidor (de lo contrario, no tendría que hacerlos). ; es muy concebible que un atacante de este tipo también obtenga acceso de solo lectura al código del servidor en sí mismo y, por lo tanto, obtenga conocimiento del método de hashing que utiliza.
Por último, pero no menos importante, no puedes saber cuánto tu algoritmo hash es secreto. Gran parte de la seguridad se trata de cuantificar y medir. Con una contraseña, puede estimar la entropía , dependiendo del mecanismo de generación; lo mismo para cualquier clave secreta: las claves viven en un espacio de un tamaño que se puede evaluar a través de las matemáticas. Pero, ¿el secreto de un algoritmo , que existe en varios lugares, incluido el código fuente, ejecutables, hojas impresas, copias de seguridad y el cerebro de algunos desarrolladores? ¿Cuánto secreto puede ser?
Kerckhoff lo explicó claramente hace más de un siglo: no debe considerar su sistema como secreto. Las claves (y las contraseñas, que son solo un tipo de clave) están diseñadas para concentrar el secreto, mientras que el resto del algoritmo debe considerarse público, porque, la mayoría de las veces, es conocimiento público.