Nadie sensato guarda claves en texto plano en la base de datos de una aplicación web. Normalmente se toma el password y se "hashea" con un algoritmo como md5. El proceso usa un algoritmo de cifrado de un sólo camino que es, en teoría, matemáticamente irrompible. Luego el password nunca se vuelve a descifrar, sino que la clave que el usuario envía desde el cliente se cifra con el mismo algoritmo y del lado del servidor se comparan ambas versiones cifradas.
PHP historicamente ha usado el algoritmo MD5 o SHA1, tradicionales pero muy inseguros. En el pasado Defcon fue posible romper más del 50% de los hash MD5 que se presentaron, usando colisiones matemáticas y fuerza bruta. A partir de PHP5.5, el nuevo algoritmo de cifrado de hashs para passwords será bcrypt, que usa un nuevo proceso matemático 10 veces más fuerte.

Código nuevo de cifrado de contraseñas de PHP 5.5
Antes tu habrías escrito:
Código :
$hash = md5($clave_usuario);
Que no tenía "salt" (un modificar aleatorio interno del cifrado para hacer el descifrado por fuerza bruta más complejo)
Ahora es tan fácil como:
Código :
$hash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 10]); $match = password_verify($password, $hash);
Donde PASSWORD_BCRYPT es el nuevo algoritmo y 10 es el "costo" o complejidad de cifrado. La segunda linea es la que funciona para comparar un password contra un hash. La "sal" se genera automáticamente por server por app.
Si no has podido actualizar a PHP5.5 en tu servidor, siempre puedes usar la implementación en puro PHP y hacer tus apps de PHP más robustas y seguras. Te recomendamos que lo hagas ya.
¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.
Por emmanuel el 12 de Septiembre de 2012
Por airwolf97 el 13 de Septiembre de 2012
airwolf97 :
Airwolf, todas las opciones que mencionas siguen siendo altamente interceptables. Del lado del cliente, lo correcto es usar SSL. Este artículo solo cubre el lado del server, desde el cual, con bcrypt, es seguro.
Por alez91 el 13 de Septiembre de 2012
Por eTrejo el 13 de Septiembre de 2012
Una vez mas Gracias!
Por dnlsanchez el 13 de Septiembre de 2012
y si entra un troyano a tu computadora se roba la contraseña en cuanto la escribes sin necesidad de enviarla, también debemos crear un antivirus en javascript??
Por Nico el 15 de Septiembre de 2012
Como se ha dicho, https para enviar contenido cifrado, cifrar la contraseña en el servidor, y por sobre todas las cosas, la capa de abstracción de datos debe ser consistente y segura, es el eslabón más importante de la cadena de seguridad.
Por Carlos el 25 de Septiembre de 2012
Por fgcaipe el 26 de Septiembre de 2012
$hash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 10]);
me da el siguiente error:
6:20:13 2012] [error] [client 127.0.0.1] PHP Parse error: syntax error, unexpected '[' in C:\\wamp\\www\\bcrypt\\enc.php on line 8, referer: http://localhost/bcrypt/
fgcaipe-blog :
$hash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 10]);
me da el siguiente error:
6:20:13 2012] [error] [client 127.0.0.1] PHP Parse error: syntax error, unexpected '[' in C:\\wamp\\www\\bcrypt\\enc.php on line 8, referer: http://localhost/bcrypt/
la forma de crear arrays asi ['cost' => 10] esta disponible desde PHP 5.4 y creo que lo de password_hash estara en PHP 5.5
Por legion el 02 de Octubre de 2012