php - password - Cifrado de contraseñas
login con contraseña encriptada php (7)
¿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.
Considere usar bcrypt
que se usa en muchos marcos modernos como laravel.
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");
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
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.
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.
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 conclusion fue que debe usar el método de encriptación más lento y seguro que pueda permitirse. .
Del blog de Thomas Ptacek:
La velocidad es exactamente lo que no quieres en una función de 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.
password_hash ( string $password , int $algo [, array $options ] )
. (PHP 5> = 5.5.0, PHP 7)
password_hash () crea un nuevo hash de contraseña usando un fuerte algoritmo de hash unidireccional. password_hash () es compatible con crypt (). Por lo tanto, los hashes de contraseña creados por crypt () se pueden usar con password_hash ().