Cifrado de contraseñas

votos
27

¿Cuál es la forma más rápida pero segura de encriptar las contraseñas en (PHP preferido), y para cada método que elija es portátil?

En otras palabras, si más tarde migro mi sitio web a un servidor diferente, ¿continuará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.

Publicado el 03/08/2008 a las 12:50
fuente por usuario
En otros idiomas...                            


7 respuestas

votos
29

Si elige un método de encriptación para su sistema de inicio de sesión, entonces la velocidad no es su amigo. Jeff conversó con Thomas Ptacek sobre contraseñas y la conclusión fue que debe usar el método de encriptación más lento y seguro que pueda permitirse. .

Desde el blog de Thomas Ptacek: la
velocidad es exactamente lo que no quieres en una función hash de contraseña.

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

Los crackers incrementales no precalculan todas las posibles contraseñas crackeadas. 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 de PHP. Las galletas de mesa Rainbow como Ophcrack usan espacio para atacar contraseñas; Los crackers incrementales como John the Ripper, Crack y LC5 funcionan con el tiempo: estadísticas y cálculo.

El juego de ataque con contraseña se puntúa en el tiempo necesario para descifrar la contraseña X. Con las tablas del arcoíris, ese tiempo depende de qué tan grande debe ser su mesa y qué tan rápido puede buscarla. Con 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 la función hash de contraseña, más débil será su esquema. MD5 y SHA1, incluso los sistemas de cifrado convencionales como DES, están diseñados para ser rápidos. MD5, SHA1 y DES son hashes de contraseña débiles. En las CPUs modernas, los bloques 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 muy rápidas. Las implementaciones de Game-over FPGA cuestan solo cientos de dólares.

Respondida el 03/08/2008 a las 13:48
fuente por usuario

votos
14

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

Según mi lectura, bcrypt está específicamente diseñado para el hashing 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 haga .NET, echa un vistazo a BCrypt.NET http://derekslager.com/blog/posts/2007/10/bcrypt-dotnet-strong-password-hashing-for-dotnet-and-mono.ashx

Respondida el 03/08/2008 a las 14:48
fuente por usuario

votos
8

Debe señalarse que no desea encriptar la contraseña, quiere hash it.

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


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

  • SHA-256

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

  • contraseña: password1
  • sal: PasswordSaltDesignedForThisQuestion

Agregue la sal a la contraseña del usuario:

String s = HashStringSHA256("password1PasswordSaltDesignedForThisQuestion");
Respondida el 17/09/2008 a las 19:06
fuente por usuario

votos
7

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

Respondida el 17/09/2008 a las 19:16
fuente por usuario

votos
2

Considere el uso bcryptque se utiliza en muchos marcos modernos como laravel.

Respondida el 16/07/2016 a las 04:47
fuente por usuario

votos
2

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

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

Respondida el 05/08/2008 a las 00:07
fuente por usuario

votos
0

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

password_hash () crea un nuevo hash de la contraseña usando un algoritmo hash unidireccional fuerte. password_hash () es compatible con crypt (). Por lo tanto, los hashes de contraseñas creadas por crypt () se pueden utilizar con password_hash ().

Respondida el 18/05/2018 a las 15:27
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more