2008-08-03 27 views
27

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

En otras palabras, si más adelante migro mi sitio web a un servidor diferente, ¿continuarán funcionando mis contraseñas?

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

Respuesta

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 tuvo una conversación con Thomas Ptacek sobre contraseñas y el conclusion fue que debe usar el método de encriptación más lento y seguro puedes permitirte

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

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

Los crackers incrementales no precalculan todas las contraseñas crackeadas 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 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 de contraseña se puntúa en el tiempo necesario para descifrar la contraseña X. Con tablas de 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.

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.

De 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, echa un vistazo a 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

2

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

No tiene por qué ser el más seguro, no estoy Codding para un banco (en este momento), pero sin duda NO SE almacenar las contraseñas como texto sin formato.

+0

Mientras está cerrado, aún debe tener contraseñas hash de la forma más segura posible. ¿Cuál es la forma más fácil de obtener la contraseña de la cuenta bancaria de algunos? Crea un sitio web increíble en el que consigas que la gente se registre. La mayoría de las personas usará contraseñas existentes. Ahora tienes una gran lista de contraseñas. Siendo así, la forma más rápida de obtener las contraseñas de otras personas sería hackear SU sistema si supiera que fue una implementación deficiente. –

8

Es preciso señalar que no desea cifrar la contraseña, usted quiere de hash ella.

Las contraseñas encriptadas 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 - utilizar el actualmente aceptado estándar de un:

  • SHA-256

Y cuando hash de la contraseña del usuario, asegúrese también de hachís en alguna otra basura con eso. por ejemplo:

  • contraseña: password1
  • sal: PasswordSaltDesignedForThisQuestion

añada la sal a la contraseña del usuario:

String s = HashStringSHA256("password1PasswordSaltDesignedForThisQuestion"); 
+4

-1 SHA-256 no es una función de hash de contraseña y no es seguro para este propósito. Puede ser * parte de uno * (PBKDF2), pero eso es completamente diferente. También su ejemplo es engañoso, porque la sal no debe ser una frase inteligente, debe ser un valor aleatorio (por usuario). –

7

lo que haga, no escribe su propio algoritmo de cifrado . 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.

+0

Incluso si usted es un criptógrafo, probablemente tenga un defecto: toma años de revisión antes de que un algoritmo se vuelva 'popular' –

+1

Esto es muy cierto. Y me recuerda una anécdota similar de Don Knuth en la línea de: hace mucho tiempo intentó escribir un generador de números aleatorios y acumuló tantas operaciones oscuras como se le ocurría. Finalmente ejecutó esta creación monumental y arrojó el número 4 indefinidamente. (Los detalles pueden haber sido alterados en el recuento). – ndkrempel

2

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

Cuestiones relacionadas