¿Debes hacer público el algoritmo?
Tratar de ocultar los detalles de la implementación (como el algoritmo de hash que usa) para preservar la seguridad es la definición de seguridad en la oscuridad . Existe un amplio consenso de que la oscuridad no debe ser su única línea de defensa.
Si necesitas mantener tu algoritmo hash en secreto, lo estás haciendo mal y debes elegir un mejor algoritmo hash. Cuando usas un buen algoritmo, no hay razón para no decírselo al mundo, ya que de todos modos no podrán romper tus hashes.
También tenga en cuenta que en su caso la sal lo regalará. Si alguien se apodera de su base de datos, podrá leer qué algoritmo se utilizó a partir de eso. Por lo tanto, la oscuridad no hace que la fuerza bruta sea más difícil aquí. La publicidad de un esquema débil, sin embargo, podría alentar a los atacantes. Una fuerte podría tener el efecto contrario. El punto que Mike Goodwin señala en su respuesta también debe tenerse en cuenta.
¿Es segura crypt ()?
La pregunta relevante es, por lo tanto, si crypt()
es lo suficientemente seguro. Echemos un vistazo al manual de PHP :
password_hash()
usa un hash fuerte, genera una sal fuerte y aplica rondas adecuadas automáticamente. password_hash()
es un envoltorio simple crypt()
y es compatible con hashes de contraseña existentes. Se recomienda el uso de password_hash()
.
Algunos sistemas operativos admiten más de un tipo de hash. De hecho, a veces el algoritmo basado en DES estándar es reemplazado por un algoritmo basado en MD5.
El crypt()
basado en DES estándar devuelve la sal como los dos primeros caracteres de la salida. También solo utiliza los primeros ocho caracteres de str
, por lo que las cadenas más largas que comienzan con los mismos ocho caracteres generarán el mismo resultado (cuando se usa la misma sal).
La función utiliza diferentes algoritmos según cómo se formatee la sal. Algunos de los algoritmos son muy débiles, y los fuertes pueden no estar disponibles en todos los sistemas. Entonces, dependiendo del algoritmo utilizado, hay una serie de problemas aquí:
- Para algunos algoritmos,
crypt()
solo aplica una ronda de hash. Eso es demasiado rápido y permitirá un ataque de fuerza bruta.
- En algunas circunstancias,
crypt()
usará MD5, que se sabe que es débil.
- El uso exclusivo de los primeros ocho caracteres anula completamente los beneficios de las contraseñas largas.
Por lo tanto, sugiero que cambie a password_hash()
. Te permite usar bcrypt, un algoritmo probado y comprobado. Entonces puedes decirle al mundo con orgullo sobre tu esquema de hash.