Seguridad de acceso en PHP (II). Contraseñas no reversibles.

Facebooktwittergoogle_pluslinkedinmailFacebooktwittergoogle_pluslinkedinmail

clave_irreversibleEn el artículo anterior vimos cómo crear un algoritmo de codificación reversible de las contraseñas. El sistema es suficiente en muchos casos, pero no en aquellas aplicaciones que manejen datos especialmente sensibles o delicados, como la posibilidad de hacer movimientos en una cuenta bancaria, o gestionar trámites con las administraciones públicas. En esos casos, la seguridad debe ser mayor, lo que nos lleva a encriptación no reversible.

ENCRIPTACIÓN NO REVERSIBLE

Este sistema es el más seguro ya que, ante un eventual robo de base de datos, sabemos que el atacante no podrá desencriptar las contraseñas de los usuarios. La desventaja es que, si el usario pierde u olvida la clave, la aplicación debe generarle una nueva clave, enviársela por correo electrónico, y almacenarla, encriptada mediante el mismo algoritmo irreversible, en la base de datos. En sitios de mucha seguridad, la clave generada que se le envía al usuario sólo le permite acceder, durante un corto espacio de tiempo, a un área especial de la aplicación donde lo único que puede hacer, es establecer una nueva contraseña que le permita acceder libremente a toda la aplicación.

Como puedes entender, este sistema es más engorroso para el usuario, pero hay ocasiones en las que resulta conveniente sacrificar cierta comodidad en aras de una mayor seguridad.

Para encriptar una contraseña cuando el usuario la establece usamos, en PHP, la función irreversible password_hash(). Tienes la documentación oficial en este enlace.

A continuación tienes un ejemplo de cómo debe ser encriptada la contraseña tecleada por el nuevo usuario (o por un restablecimiento por pérdida), para grabarla en la base de datos.

$claveQueSeGrabara = password_hash($claveElegidaPorElUsuario, PASSWORD_BCRYPT);

Cuando el usuario intenta acceder al sitio y teclea su clave de acceso, debemos verificarla contra la clave encriptada que hay en la base de datos. Para ello, leemos la que hay almacenada y usamos la función password_verify() con la que ha tecleado el usuario, así:

// $claveAlmacenada es la que hay encriptada en la base de datos.
// $claveTecleada es la que el usuario ha tecleado para acceder.
if (password_verify ( $claveTecleada, $claveAlmacenada)) {
    // Acceso concedido
} else {
    // Acceso denegado
}

La documentación oficial sobre esta función está disponible en el este enlace.

Debes tener en cuenta que estas funciones sólo están disponibles a partir de PHP 5.5. Cómo la versión actual es la 7, y la mayoría de los servidores implementan actualmente, cómo mínimo, la 5.6, esto puede resultar irrelevante pero, si tu servidor implementa una versión antigua de PHP, es posible que no tengas acceso a estas funciones. Asegúrate de que tu PHP esté actualizado.

     

Un comentario:

  1. Pingback: Seguridad de acceso en PHP (I). Contraseñas reversibles. » eldesvandejose.com

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *