Esto se logra mediante mecanismos que permiten desde el código de la aplicación controlar el acceso y los roles de usuarios.
Por ejemplo un sistema que se ataque por fuerza bruta debería bloquar el acceso o la ip, después del tercer intento fallido y no permitir infinitos intento.
Todo algoritmo o método de encriptación tiene la función de codificar los datos para dificultar su lecturas y que sea indescifrable.
Encriptación y Desencriptación Base64 (Advanced Encryption Standard)
La encriptación Base64 se basa en caracteres ASCII, se utiliza para codificar información en correos electrónico, enviar información en una red normalmente se utiliza para encriptar datos que no son texto, imágenes, archivos adjuntos, etc.
Veamos un ejemplo de como codificar y decodificar Base64 con pHp:
<?php $text = 'Tutorial encriptación Base64'; ?> <?php $encriptado = base64_encode($text); echo "<strong>Encriptado:</strong> ".$encriptado ."<br><br>"; $desencriptado = base64_decode($encriptado); echo "<strong>Desencriptado: <strong> ".$desencriptado ."<br>";
Así podemos guardar los datos encriptados y desencriptarlos sólo cuando los necesitemos, de todas maneras es un método poco seguro.
Encriptación y Desencriptación MD5 (Message Digest 5)
El método de criptografía MD5 o Resumen del Mensaje 5 es un algoritmo de reducción criptográfico de 128 bits muy utilizado para cifrar contraseñas como Wordpress, Prestashop, Joomla entre otros.
No se puede decodificar, aunque algunas web van recolectando palabras y convirtiéndolas a MD5 para tener una base de datos con posibles codificaciones.
Podemos observar una tabla con su clave codificada en formato MD5. Veamos un ejemplo de como codificar y decodificar MD5 con pHp:
<?php $texto = "Tutorial de Encriptación"; echo "Encriptado de 32 caracteres: ".md5($texto)."<br><br>";?>Veamos un ejemplo de cómo utilizar una clave para control de acceso, siempre de la base de datos extraemos el dato codificado y lo comparamos con el ingresado por el usuario previamente codificado:
<strong>Login Usuario</strong> <?php $login = "miclave"; if (md5($login) == "3d3232b2f031f070d9ba5969b87776ff") { echo "<br>Acceso permitido"; } ?>
Encriptación y Desencriptación AES (Advanced Encryption Standard)
El uso de la encriptación AES en MySQL es la más segura que se ha incorporado al gestor de base de datos a partir de la versión 5.6, utiliza dos funciones: AES_ENCRYPT y AES_DECRYPT, para utilizar en forma directa en sentencias SQL. AES es rápido, fácil de implementar por código en php, utilizar poca Ram, por lo que este método se convierte en un estándar de cifrado, se está utilizando actualmente en muchos sistemas a gran escala y sitios en web.
Este método utiliza diversos parámetros para cifrar información, ellos son:
- Cifrar: indica el nivel de cifrado 128,256
- Clave: es una clave encriptada compuesta por otras dos claves una del sistema y otra la del usuario.
- Datos: son los datos a cifrar.
- Modo: un modo de cifrado es un tipo de encriptador que utiliza divide en bloques la información y luego la encripta. Existe muchos modos de encriptación, veremos los mas importantes ellos son:
- Modo ECB o Libro de códigos electrónico: es adecuado para datos aleatorios, tales como el cifrado de otras claves.
- Modo CBC o Encadenamiento de bloques de cifrado: es especialmente adecuado para el cifrado de archivos.
- Iv: es un vector de inicialización, es un conjunto de bits que se utiliza para permitir un cifrado por bloques,
- Clave MAC: es un código de autenticación de mensajes (MAC), es una clave cifrada que se utiliza para para brindar garantías de integridad y autenticidad del mensaje.
Una vez encriptado se crea otra clave con el resultado de la encriptación y la clave secreta, en total tendremos 4 claves todas encriptadas antes de ver la información.
La función en php seria la siguiente:
$texto_cifrado=mcrypt_encrypt($cifrar, $clave, $dato_a_cifrar, $modo, $iv)Creamos una clase en php para implementar una función de encriptación y desencriptación de alta seguridad.
Creamos una clave privada secreta que pude ser encriptada con Base4 pero no superar los 32 caracteres
Clave: miSitio@web2157:tutorialencriptacion Base64: bWlTaXRpb0B3ZWIyMTU3OnR1dG9yaWFsZW5jcmlwdGFjaW9u
<?php class Encriptador { // Genero clave secreta // Clave secreta privada convertida a Base64 // miSitio@web2157:tutorialencriptacion public static $clavesecreta = 'bWlTaXRpb0B3ZWIyMTU3OnR1dG9yaWFsZW5jcmlwdGFjaW9u'; // funcion Encriptar con AES-256 public static function encriptar($datoacifrar, $clave, $clavesistema = null) { //si no se creo una clave de sitema automatica utilizo la clave secreta por defecto if ($clavesistema === null) { $clavesistema = $clavesecreta; } // Genero la clave Mac combinando las dos claves, cifrandolas y tomando los primeros 32 caracteres $clave = substr(hash('sha256', $clave . $clavesistema), 0, 32); //Defino el tipo y modo de encriptacion $tipoencriptacion = MCRYPT_RIJNDAEL_256; $modo = MCRYPT_MODE_CBC; //calculo el tamaño del vector de inicio $ivectortotal = mcrypt_get_iv_size($tipoencriptacion, $modo); // creo el vector de inicio $ivector = mcrypt_create_iv($ivectortotal, MCRYPT_DEV_URANDOM); //encripto los datos y le añado el vector de inicio $encriptado = $ivector . mcrypt_encrypt($tipoencriptacion, $clave, $datoacifrar, $modo, $ivector); //creo la clave mac para autentificar el encriptado $clavemac = hash_hmac('sha256', $encriptado, $clave); //devuelvo el resultado encriptado final return $clavemac . $encriptado; } // funcion Desencriptar con AES-256.. public static function desencriptar($datoadescifrar, $clave, $clavesistema = null) { //si no se creo una clave de sitema automatica utilizo la clave secreta por defecto if ($clavesistema === null) { $clavesistema = $clavesecreta; } // Genero la clave Mac combinando las dos claves, cifrandolas y tomando los primeros 32 caracteres $clave = substr(hash('sha256', $clave . $clavesistema), 0, 32); # Generamos y comparamos la clave MAC $clavemactotal= 64; //maximo 64 caracteres $clavemac = substr($datoadescifrar, 0, $clavemactotal); $datoadescifrar = substr($datoadescifrar, $clavemactotal); $clavemacgenerada = hash_hmac('sha256', $datoadescifrar, $clave); if ($clavemac !== $clavemacgenerada) { //el mensaje no es autentico las claves Mac son distintas return false; } $tipoencriptacion = MCRYPT_RIJNDAEL_256; $modo = MCRYPT_MODE_CBC; $ivectortotal = mcrypt_get_iv_size($tipoencriptacion, $modo); $ivector = substr($datoadescifrar, 0, $ivectortotal); $datoadescifrar = substr($datoadescifrar, $ivectortotal); //desencriptamos la información con todos los parametros generados $desencriptado = mcrypt_decrypt($tipoencriptacion, $clave, $datoadescifrar, $modo, $ivector); return $desencriptado; } // Genero una clave automática de 32 caracteres public function generarclavesistema($maximo = 0) { $caracteres = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdef@$%&/()=¡+ghijklmnopqrstuvwxyz0123456789'; $clave = ''; $totalcaracteres = strlen($caracteres); while ($totalcaracteres--> 0) { $clave .= $caracteres[mt_rand(0, $totalcaracteres-1)]; } return $clave; } } //Fin clase //Aplicamos la clase creada para encriptar y desencriptar un texto $Cifrar = new Encriptador(); $datos = "Tutorial de Encriptación y Seguridad"; echo "<strong>Datos a cifrar: </strong>". $datos."<br><br>";; $clave = $Cifrar→generarclavesistema(32); $encriptado = $Cifrar->encriptar($datos, $clave); echo "<strong>Datos encriptados: </strong>".$encriptado."<br><br>"; $desencriptado = $Cifrar->desencriptar($encriptado, $clave); echo "<strong>Datos desencriptados: </strong>".$desencriptado."<br><br>"; ?>En el caso de MySQL a partir de la versión 5.6 incorpora el soporte nativo para AES, de tal manera que podemos insertar datos y encriptarlos al mismo tiempo por ejemplo:
Encriptamos la clave de un usuario utilizando la función AES_ENCRYPT
INSERT INTO clientes (id,clave,email) VALUES (1,AES_ENCRYPT($dato, $clavesistema), usuario@gmail.com);Para consultar la tabla clientes y desencriptar un dato utilizo la función AES_DECRYPT
SELECT id, CAST(AES_DECRYPT(clave, $clavesistema)), email from clientes;La función CAST toma un resultado o campo y lo convierte el resultado en un tipo de dato por ejemplo número a texto.
A mi me ha encantado este tutorial Sergio. Me lo he apuntado. saludos.