Pregunta

¿Cuál es la forma más rápida y segura de cifrar contraseñas (preferiblemente PHP) y, sea cual sea el método que elija, es portátil?

En otras palabras, si luego migro mi sitio web a un servidor diferente, ¿seguirán funcionando mis contraseñas?

El método que estoy usando ahora, como me dijeron, depende de las versiones exactas de las bibliotecas instaladas en el servidor.

¿Fue útil?

Solución

Si elige un método de cifrado para su sistema de inicio de sesión, entonces la velocidad no es su amiga, Jeff tuvo una discusión con Thomas Ptacek sobre las contraseñas y el conclusión fue que debería utilizar el método de cifrado más lento y seguro que pueda permitirse.

Del blog de Thomas Ptacek:
La velocidad es exactamente lo que no desea en una función hash de contraseña.

Los esquemas de contraseñas modernos son atacados con crackers de contraseñas incrementales.

Los crackers incrementales no calculan previamente todas las contraseñas posibles.Consideran cada hash de contraseña individualmente y alimentan su diccionario a través de la función hash de contraseña de la misma manera que lo haría su página de inicio de sesión PHP.Los crackers de mesa Rainbow como Ophcrack usan el espacio para atacar contraseñas;Los crackers incrementales como John the Ripper, Crack y LC5 funcionan con el tiempo:estadística y computación.

El juego de ataque de contraseña se puntúa en el tiempo necesario para descifrar la contraseña X.Con las tablas Rainbow, ese tiempo depende de qué tan grande debe ser tu mesa y qué tan rápido puedes buscarla.Con los crackers incrementales, el tiempo depende de qué tan rápido pueda ejecutar la función hash de contraseña.

Cuanto mejor pueda optimizar su función hash de contraseña, cuanto más rápida sea su función hash de contraseña, más débil será su esquema.MD5 y SHA1, incluso los cifrados de bloques convencionales como DES, están diseñados para ser rápidos.MD5, SHA1 y DES son hashes de contraseñas débiles.En las CPU modernas, los bloques de construcción criptográficos sin procesar, como DES y MD5, se pueden dividir en bits, vectorizar y paralelizar para hacer que las búsquedas de contraseñas sean increíblemente rápidas.Las implementaciones de FPGA Game-over cuestan sólo cientos de dólares.

Otros consejos

Estoy con Pedro.El desarrollador no parece entender las contraseñas.Todos elegimos (y yo también soy culpable de esto) MD5 o SHA1 porque son rápidos.Pensándolo bien (porque alguien me lo señaló recientemente) eso no tiene ningún sentido.Deberíamos elegir un algoritmo hash que sea estúpidamente lento.Quiero decir, en la escala de las cosas, un sitio ocupado hará hash de contraseñas, ¿qué?cada 1/2 minuto?¿A quién le importa si el servidor tarda 0,8 segundos frente a 0,03 segundos?Pero esa lentitud adicional es enorme para prevenir todo tipo de ataques comunes de fuerza bruta.

Según mi lectura, bcrypt está diseñado específicamente para el hash seguro de contraseñas.Está basado en pez globo y hay muchas implementaciones.

Para PHP, consulte PHPPass http://www.openwall.com/phpass/

Para cualquiera que utilice .NET, consulte BCrypt.NET http://derekslager.com/blog/posts/2007/10/bcrypt-dotnet-strong-password-hashing-for-dotnet-and-mono.ashx

Cabe señalar que no desea cifrar la contraseña que deseas picadillo él.

Las contraseñas cifradas se pueden descifrar, permitiendo que alguien vea la contraseña.El hashing es una operación unidireccional, por lo que la contraseña original del usuario desaparece (criptográficamente).


En cuanto a qué algoritmo debe elegir, utilice el estándar actualmente aceptado:

  • SHA-256

Y cuando hagas hash de la contraseña del usuario, asegúrate de hacer hash también con otra basura.p.ej.:

  • contraseña: password1
  • sal: PasswordSaltDesignedForThisQuestion

Agregue el salt a la contraseña del usuario:

String s = HashStringSHA256("password1PasswordSaltDesignedForThisQuestion");

Hagas lo que hagas, no escribas tu propio algoritmo de cifrado.Hacer esto casi garantizará (a menos que sea un criptógrafo) que habrá una falla en el algoritmo que hará que sea trivial de descifrar.

Considere usar bcrypt se utiliza en muchos marcos modernos como laravel.

No estoy necesariamente buscando el más rápido, pero sí un buen equilibrio, algunos de los servidores para los que se está desarrollando este código son bastante lentos, el script que codifica y almacena la contraseña tarda entre 5 y 6 segundos en ejecutarse, y he Lo redujo al hash (si comento el hash, se ejecuta en 1-2 segundos).

No tiene que ser lo MÁS seguro, no estoy codificando para un banco (en este momento) pero ciertamente NO LO HARA almacene las contraseñas como texto sin formato.

password_hash ( string $password , int $algo [, array $options ] ).(PHP 5 >= 5.5.0, PHP 7)

password_hash() crea un nuevo hash de contraseña utilizando un potente algoritmo de hash unidireccional.contraseña_hash() es compatible con crypt().Por lo tanto, los hashes de contraseña creados por crypt() se pueden usar con contraseña_hash().

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top