You are on page 1of 6

Ver este artículo en el blog​ - ​Google+​ - ​@tuprimeraweb

3 Ejercicios Para Encriptar y Desencriptar Datos en MySQL 


Empezaremos con este post con el primero de tres ejercicios que consistirán en:
1. La base de datos y un formulario para guardar claves encriptadas (en este
artículo)
2. Un formulario para validar los datos de un visitante
3. Un formulario de emergencia para os usuarios que olvidaron su contraseña
personal
Si deseas recibir las siguientes publicaciones en tu bandeja de correo anótate en el
formulario a la derecha “Suscripción por correo electrónico”, o también podrías sindicar
este blog con la​ ​dirección de nuestros feed​ .

El ejercicio esta preparado para quienes tengan conocimientos​ ​intermedios de PHP


(base de datos), del uso de​ ​phpMyAdmin​ y HTML5, trataré de mantener la explicación
lo más sencilla posible.

La base de datos 
Ingresamos a phpMyAdmin para diseñar nuestra base de datos (la nombraré ‘​datos​’),
para no complicarnos el ejercicio y centrarnos en lo que nos interesa agregamos la
tabla ‘​usuarios​’ con la siguiente estructura (5 campos):
Campo Atributos

idusuario entero, PK, auto_incremental

nombres varchar de 50 caracteres (en realidad pediremos


nombre y apellido)

nick varchar de 50 caracteres, índice único (para


impedir dos usuarios con el mismo alias)

clave varchar de 50 caracteres

clavex longtext (es para guardar la clave encriptada)

Una vista de mi phpMyAdmin:

Pág. 1
Ver este artículo en el blog​ - ​Google+​ - ​@tuprimeraweb

Y para quienes prefieren insertar instrucciones de comando a continuación las líneas


del script al generar un backup de la BD:

-- phpMyAdmin SQL Dump


-- version 3.5.1
-- http://www.phpmyadmin.net
-- Servidor: localhost
-- Tiempo de generación: 05-10-2013 a las 10:49:13
-- Versión del servidor: 5.5.24-log
-- Versión de PHP: 5.3.13
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
/*!40101 SET
@OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET
@OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET
@OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
-- Base de datos: `datos`
-- --------------------------------------------------------
-- Estructura de tabla para la tabla `usuarios`
CREATE TABLE IF NOT EXISTS `usuarios` (
`idusuario` int(11) NOT NULL AUTO_INCREMENT,
`nombres` varchar(50) NOT NULL,
`nick` varchar(50) NOT NULL,
`clave` varchar(50) NOT NULL,
`clavex` longtext NOT NULL,
PRIMARY KEY (`idusuario`),
UNIQUE KEY `nick` (`nick`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
/*!40101 SET
CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET
CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET
COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

Sobre la encriptación de cadenas 


No voy a extenderme en este punto sobre el que hay mucha y diversa información, me
basaré en el sitio en español de​ ​PHP.net​ sobre​ ​funciones de hash​, y de forma
particular usaré la función​ ​hash_hmac()​, posiblemente alguién me corrija sobre una
mejor opción y saldré ganando .
¿Cómo saber si tu servidor soporta esta u otras cadenas hash? Carga phpinfo(), si no
hay un acceso rápido crea una página en tu servidor con extensión php:

Pág. 2
Ver este artículo en el blog​ - ​Google+​ - ​@tuprimeraweb

<?php echo phpinfo(); ?>


Carga esta página en tu navegador y busca la cadena ‘hash’, creo que todos los
navegadores reconocen la combinación Ctrl + F, encontrarás este bloque:

La primera fila está en ‘enabled’ y significa que si soporta hash, la segunda fila
muestra todas las funciones hash que están soportadas.
La función hash_hmac() requiere al menos de 3 parámetros (tipo cadena) en este
orden:
1. El algoritmo de cifrado que se va a usar, usaré en este ejercicio sha512, que en
lo personal me parece bastante seguro (recordemos que la seguridad está en
una serie de buenas prácticas y no solamente en encriptar).
2. La cadena a cifrar
3. Otra cadena que se usará en el algoritmo para encriptar la cadena 2 (usaré
‘primeraweb’).
4. Opcionalmente un valor booleano, al omitir permanece en FALSE y la salida
estará en valor hexadecimal en minúsculas.
Otro dato importante es que la cadena encriptada no podrá ser desencriptada, en
realidad lo que haremos en el segundo ejercicio es comparar dos cadenas
encriptadas.

El formulario 
Ahora el formulario en donde se registrará el nuevo usuario, solicitaremos su nombre y
apellido, su nombre de usuario y su contraseña, en la pagina ​encripta1.php​, las
excusas del caso, omitiré las mayorías de las etiquetas para ir directamente al
formulario:
<header>
<h1>Formulario de registro</h1>
</header>
<form name="f1" action="encripta2.php" method="post">
Nombre y apellido<input type="text" name="nombres" placeholder="Su
nombre y apellido" autofocus required />
<br />
Nombre de usuario<input type="text" name="nick" placeholder="Nombre
de usuario" required />
<br />
Contrase&ntilde;a<input type="password" name="clave" required />
<br />
<input type="submit" value="Registrar mis datos" />
Pág. 3
Ver este artículo en el blog​ - ​Google+​ - ​@tuprimeraweb

</form>
Nota: Si van a copiar y pegar es muy probable que tendrán que corregir las comillas.
Al cargar en el navegador tendremos esto (el navegador de Microsoft 8 y anteriores no
sirven para HTML5):

En el ​action​ del formulario indicamos que los datos se enviarán a ‘​encripta2.php​’, allí
procesaremos los datos encriptando la clave y almacenado en la BD, nuevamente iré
directo a la implementación que nos interesa:

Este bloque termina imprimiendo la cadena encriptada (tranquilos, aún no hemos


terminado) compuesta de dígitos hexadecimal en minúsculas, continuemos, puesto
que solo lo coloqué para una prueba quitaré esa última línea.

Nos conectamos al servidor MySQL con ‘​mysqli_connect()​’ y preparamos en la


variable ​$cadena_sql​ nuestra instrucción ​Insert​ para guardar los nuevos datos, quité
las barras a la última línea para imprimir la instrucción SQL.

Ejecutamos la consulta con ‘​mysqli_query()​’, si la consulta de ejecuta devolverá un


entero mayor a cero, es el número de registros afectados (en este caso se insertó un
solo registro), si la operación fracasa se devuelve cero. Para eso usamos la estructura
‘​if​’ y mostramos un mensaje según la tarea tuvo éxito o no.
Con ‘​mysqli_close()​’ cerramos el recurso de conexión, el código completo de esta

Pág. 4
Ver este artículo en el blog​ - ​Google+​ - ​@tuprimeraweb

página es (nuevamente voy directo a lo que nos interesa):


<header>
<h1>Registrando sus datos</h1>
</header>
<?php
$nombres = $_POST["nombres"];
$nick = $_POST["nick"];
$clave = $_POST["clave"];
//Encriptamos la clave ingresada y la almacenamos en $clavex
$secret = "primeraweb";
$clavex = hash_hmac("sha512", $clave, $secret);
//Conectando a la BD
$servidor = "localhost";
$usuario = "root";
$pass = "";
$bd = "datos";
$cone = mysqli_connect($servidor,$usuario, $pass, $bd)or die(mysql_error());
$cadena_sql = sprintf("Insert Into usuarios Values(null, '%s', '%s', '%s', '%s')",
$nombres, $nick, $clave, $clavex);
//echo $cadena_sql;
$x = mysqli_query($cone, $cadena_sql);
if($x > 0){
echo "Sus datos han sido guardado, ya est&aacute;s registrado :).";
}else{
echo "¡Oops! Hubieron problemas, sus datos no pudieron registrarse.";
}
mysqli_close($cone);
?>
<footer>
<p><a href="encripta1.php">Volver</a></p>
</footer>
Carga tu formulario, ingresa los datos y ve a revisar los datos de tu tabla en
phpMyAdmin:

¡Y ya tenemos nuestro primer registro guardado! Y con esto terminamos nuestro


primer ejercicio, no olviden suscribirse arriba a la derecha para los siguientes ejercicios
¡Buen fin de semana!

Pág. 5
Ver este artículo en el blog​ - ​Google+​ - ​@tuprimeraweb

Este documento es para libre distribución, siempre que se use con fines educativos y 
no para propósitos lucrativos. 

Pág. 6

You might also like