Función php para encriptar contraseña de forma correcta

Almacena contraseñas de forma segura con esta función php para encriptar contraseñas de forma segura.

La siguiente función php te permite encriptar contraseñas de forma segura, evitando así que se puedan leer o desencriptar leyendolas desde base de datos o desde la propia aplicación.

Te recomiendo que incorpores esta función en una clase de utilidades php para reutilizarla en tus proyectos. En mi caso suelo almacenar este tipo de utilidades según su uso. Por ejemplo, como esta función está dirigida a la seguridad del sitio, la incluiría en una clase SeguridadHelpers o similar.

/** función para encriptar mediante el uso de una clave secreta $key
* @param String $input: cadena de texto con la contraseña a cifrar
* @param String $key: cadena de texto con la clave secreta para cifrar las contraseñas
* @return $encrypted: cadena de texto con la contraseña cifrada.
*/		
static function encrypt($input, $key = 'secreta'){
		$iv = mcrypt_create_iv(
			mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC),
			MCRYPT_DEV_URANDOM
		);
		
		$encrypted = base64_encode(
			$iv .
			mcrypt_encrypt(
				MCRYPT_RIJNDAEL_128,
				hash('sha256', $key, true),
				$input,
				MCRYPT_MODE_CBC,
				$iv
			)
		);
		return $encrypted;
}

En esta función PHP se utilizan básicamente 3 funciones PHP para cifrado:

Cómo utilizar la función para cifrar contraseñas

Es importante que tengas en cuenta que debes mantener este código lo mejor guardado posible ya que si se accede a él se podrían descifrar las contraseñas de forma relativamente sencilla.

Para lograr mayor seguridad te recomiendo:

  1. Introduce una clave secreta para cada contraseña del sitio, la clave debe ser recuperable por tí. Es decir, podrías utilizar los 4 primeros dígitos del DNI de un usuario como clave secreta, de forma que aunque se tuviera acceso a la función que encripta, se debíera buscar la forma de obtener la clave.
  2. Si sigues el paso 1. recuerda que si pierdes la clave secreta no podrás volver descifrar la contraseña, con lo cual se tendrá que generar otra. Especial cuidado si el dato que usas para componer la clave es susceptible a sufrir cambios (Por ejemplo el Nombre y Apellidos del usuario).
  3. Asegurate que la clave $input tenga un mínimo de caracteres, ya que cifrar la contraseña no imposibilita adivinarla por ataques de fuerza bruta.

Función php para desencriptar las contraseñas generadas

Ahora que ya tienes el código para encriptar las contraseñas, te adjunto la función inversa que, con la clave secreta que se utilizo para la encriptación del password, permite restaurar a su contenido original la clave cifrada. 

static function decrypt($input, $key = 'secreta{uniqid()}'){
		$data = base64_decode($input);
		$iv = substr($data, 0, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC));
		
		$decrypted = rtrim(
			mcrypt_decrypt(
				MCRYPT_RIJNDAEL_128,
				hash('sha256', $key, true),
				substr($data, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC)),
				MCRYPT_MODE_CBC,
				$iv
			),
			"\0"
		);
		return $decrypted;
	}

Video sobre Password Hash PHP 7

Para terminar con el tutorial te dejo un video explicativo, sencillo y muy completo a nivel teórico. 

El video trata las distintas formas disponibles de encriptar contraseñas en PHP y cuáles son más adecuadas hoy por hoy. Además, te deja claro que utilziar en PHP 7.

Sobre el autor

Javier Gómez Redactor en Srcodigofuente.es

Javier Gómez

Ingeniero técnico en informática de gestión. Desarrollador web freelance y profesor de desarrollo web a partes iguales. Testarudo autodidacta, creativo, perfeccionista y alma libre.

Cargando comentarios

Utilizamos "cookies" para información estadística. Si continúas navegando aceptas su uso.