Me temo que me tirarán tomates por hacer esta vieja pregunta, pero aquí va.
Después de leer, es peligroso preparar su propio hash de contraseña para las funciones de hash existentes "over y over otra vez, todavía no No entiendo la lógica. Aquí hay algunos ejemplos:
-
md5(md5(salt) + bcrypt(password))
-
scrypt(bcrypt(password + salt))
-
sha1(md5(scrypt(password + md5(salt))))
Los argumentos típicos en contra de estos son los siguientes:
¡No eres un criptógrafo! No tienes idea si estos hashes son más seguros. Déjelo a los expertos que saben lo que están haciendo. Estos no agregan seguridad extra.
Por supuesto, no mejoran la función como un hash (es decir, hacen que sea más difícil revertir o encontrar colisiones, etc.), pero seguramente seguramente no hacen es worse como un hash? Si lo hicieran, los piratas informáticos podrían volver a aplicar hash de forma estándar a las contraseñas hash en estos hashes extraños, ya que consideran que están en forma y debilitan el hash. No lo compro.
Segundo argumento:
Principio de Kerckoffs : un criptosistema debe ser seguro incluso si se conoce todo sobre el sistema.
De acuerdo. Esta es básicamente la motivación para no almacenar sus contraseñas como texto simple en primer lugar. Pero si mi respuesta a la primera crítica se mantiene, estos hash extravagantes todavía funcionan como hash seguros, y nuestro sistema no rompe el principio de Kerckoffs más de lo que lo haría con un hash estándar.
Aquí hay dos posibles (y vale la pena, por lo que puedo ver) las ventajas de usar un hash "raro" sobre un hash normal:
- Claro, su sistema debería estar seguro si el atacante tiene el código fuente, pero es muy probable que su atacante no tenga acceso a su código fuente y probablemente no podrá adivinar su hash loco, haciendo imposible cualquier intento de fuerza bruta.
- (Esta es la motivación real detrás de mí que hace esta pregunta) Se cree que
BCrypt
es seguro, difícil para la CPU y la GPU (excelente) pero puede ser muy rápido con hardware especializado . Se dice queSCrypt
es difícil de imponer a la fuerza bruta en las CPU, GPU y actualmente está disponible en especial, pero es más reciente y la comunidad criptográfica no confía tanto como BCrypt debido a la falta de exposición que ha tenido. Pero, ¿el hashBCrypt(SCrypt(password + salt))
no obtiene lo mejor de ambos mundos?
Aprecio que la pasión / la ira detrás de la mayoría de las críticas en contra de estos hashes de fabricación casera provienen de la falta de conocimiento del programador promedio de lo que hace un buen hash, y la preocupación de que alentar este tipo de hashing loco terminará inevitablemente Hashes débiles e inútiles que ingresan al código de producción. Pero si el hash loco se construye cuidadosamente a partir de hashes sólidos y confiables, ¿las ganancias en seguridad no son muy valiosas y reales?
Actualizar
Tengo un montón de buenas respuestas sobre esto, gracias. Lo que parecía ignorar en mis suposiciones era que, aunque la combinación de hashes no puede hacer que sea más fácil descifrar la contraseña original y, por lo tanto, descifrar los hashes constituyentes, la combinación de dos o más hashes seguros puede: al menos en principio: ser más débil que cualquiera de sus hashes internos debido a las interacciones no estudiadas y complejas entre ellos. Lo que significa que podría ser posible encontrar alguna cadena que haya superado el hash loco sin romper necesariamente los hashes que lo componían.