2009-03-15 13 views
7

Me gustaría encriptar las contraseñas en mi sitio usando un cifrado bidireccional dentro de PHP. Me encontré con la biblioteca de mcrypt, pero parece tan engorroso. ¿Alguien sabe de algún otro método que sea más fácil pero seguro? Tengo acceso al Zend Framework, por lo que una solución lo usaría también.¿Cuál es la mejor manera de implementar el cifrado bidireccional con PHP?

Realmente necesito el cifrado bidireccional porque mi cliente desea entrar en el archivo db y cambiar la contraseña o recuperarla.

+2

¿Por qué el cliente desea recuperar la contraseña? Esto usualmente es una mala idea. Proporcione a los administradores las funciones para restablecer la contraseña y al usuario la posibilidad de cambiar la contraseña si conocen el original. –

Respuesta

24

debe almacenar contraseñas hash (y properly salted).

No hay excusa en el mundo que sea suficiente para romper esta regla.

Actualmente, usar crypt, con CRYPT_BLOWFISH es la mejor práctica.
CRYPT_BLOWFISH en PHP es una implementación del hash Bcrypt. Bcrypt se basa en el cifrado de bloques Blowfish.

  • Si el cliente intenta iniciar sesión, se hash de la contraseña introducida y compararlo con el hash almacenado en la base de datos. si coinciden, se concede acceso.

  • Si su cliente desea cambiar la contraseña, tendrá que hacerlo a través de un pequeño script, que correctamente hashes la nueva contraseña y la almacena en la base de datos.

  • Si su cliente desea recuperar una contraseña, debe generar una nueva contraseña aleatoria y enviarla a su cliente. El hash de la nueva contraseña se almacena en el DB

  • Si sus clientes desean buscar la contraseña actual, están fuera de suerte. Y ese es exactamente el punto de la contraseña de hash: el sistema no conoce la contraseña, por lo que nunca se puede 'buscar'/robar.

Jeff escribió sobre él: You're Probably Storing Passwords Incorrectly

Si desea utilizar una biblioteca estándar, que podría echar un vistazo a: Portable PHP password hashing framework y asegurarse de que utiliza el algoritmo CRYPT_BLOWFISH.

(En términos generales, jugar un poco con los registros en su base de datos directamente es buscar problemas.
Muchas personas -incluyendo muy experimentado DB los administradores, han encontrado que la manera más difícil.)

+0

Creo que quieres editar tu primera declaración para que diga: "Deberías almacenar las contraseñas hash" –

+0

Eeeeh, sí, gracias :) – Jacco

+1

¿Querías escribir Blowfish aquí? Blowfish == cifrado de clave simétrica, no hashing. Recomiendo encarecidamente hash sobre el cifrado. – thomasrutter

7

No cifre las contraseñas. Realmente nunca necesita descifrarlos, solo necesita verificarlos. Usar mcrypt no es mucho mejor que no hacer nada en absoluto, ya que si un pirata informático entrara en su sitio y robara las contraseñas encriptadas, probablemente también podrían robar la clave utilizada para encriptarlas.

Crea una única función de "contraseña" para tu aplicación php donde tomas la contraseña del usuario, la concatenas con un salt y ejecutas la cadena resultante a través de la función shah-256 y devuelves el resultado. Siempre que necesite verificar una contraseña, solo necesita verificar que el hash de la contraseña coincida con el hash en la base de datos.

http://phpsec.org/articles/2005/password-hashing.html

+0

Thx. Acabo de agregar esta línea a mi pregunta: realmente necesito el cifrado bidireccional porque mi cliente desea entrar en el archivo db y cambiar la contraseña o recuperarla. – Bamerza

+2

Bueno, también podría simplemente XOR la ​​contraseña con la tecla "PleaseHackMe". En serio, convenza a su cliente de que solo necesitan restablecer la contraseña, no recuperarla. –

+0

Esta es una buena respuesta, excepto que no recomendaría el algoritmo SHA-1, que se ha demostrado que es más fácil de romper de lo que debería ser. Recomendaría SHA-256 o uno de esa familia (SHA-384, SHA-512, etc.). – thomasrutter

4

Cuando realmente se necesita para recuperar las contraseñas más adelante, al menos debería utilizar claves privadas y públicas por lo que un atacante necesitaría la clave privada (que no debe ser almacenada en la misma máquina) descifrar las contraseñas

Las 2 funciones de lograr este objetivo son openssl_public_encrypt() y openssl_private_decrypt()

+0

Esto suena como el único método para lograr este objetivo y tener algo de seguridad al menos. –

+0

M_CRYPT es la biblioteca que fue diseñada para encriptación de datos y descifrado, la biblioteca OpenSSL se usa para comunicaciones secretas/seguras. – Jacco

+0

Esta es una respuesta bastante justa. También me gustaría añadir que nunca debería almacenar la clave privada en ningún lugar del mismo servidor o servidor relacionado. Es relativamente fácil buscar una clave en un disco duro completo. – thomasrutter

1

Cualquiera de lo almacenan en borrar, o almacenar un hash (es decir, NO reversible) de la contraseña.

Hacer cualquier otra cosa, especialmente el uso de cifrado simétrico con una clave codificada, básicamente no tiene sentido.

Si hace lo que sugiere y su máquina se ve comprometida, el atacante obtiene acceso no solo a las contraseñas encriptadas, sino también al código y la clave para descifrarlas, por lo que también podrían haber sido almacenadas sin cifrar.

Si desea proteger sus datos contra alguien que obtiene acceso físico a la máquina, utilice un sistema de archivos encriptado (pero aún almacene la contraseña en el claro en la base de datos). Por supuesto, cada reinicio, tendrá que ingresar manualmente la clave antes de que el sistema sea utilizable.

Cuestiones relacionadas