Codificación de cadena o string.

Resumen.

En este artículo vamos a ver que es la codificación o encriptación, vamos a conocer este concepto de forma general y veremos como podemos codificar un determinado valor y después recuperar el valor original.

Artículo.

En un sitio Web muchas veces tenemos que mover un dato de un lugar a otro pero no queremos que este dato sea perceptible en cuanto tal. Por ejemplo, alguna vez me he visto obligado a pasar por URL una dirección de e-mail, algo que no me gusta hacer, pero a veces con las presiones de, “esto tiene que estar para ya” ha sido preciso hacerlo aunque solo haya sido de manera temporal.

La encriptación o codificación consiste en cambiar la forma en que se representa la misma información. En unos casos, este proceso se realizará en un solo sentido, codificar, sin que sea posible volver al valor original, mientras que en otras, la descodificación si es posible, existiendo un método para volver al valor original.

PHP tiene una función md5() que nos permite codificar un valor en notación hexadecimal, no siendo esta codificación de tipo reversible. Imaginemos que tenemos una clave como esta: “mi_clave69”; esto codificado con md5() daría siempre el siguiente resultado: “73f92357484b579328586d5ffa1f3346” un valor siempre de 32 caracteres representado con 10 números y 6 letras “1234567890abcdef” y de este valor hexadecimal no es posible volver al original, de ahí que este se considere el método “perfecto” para guardar las claves de acceso en los sitios Web, sea esta codificación concretamente u otras. Por este motivo, muchos sitios Web que usan este método no permiten la recuperación de la clave, ya que ni ellos la conocen, solamente puedes hacer una cosa, crear una clave nueva.

Hay otros sitios Web que prefieren que sus usuarios puedan recuperar la clave, en estos sitios Web se usan métodos de codificación reversibles, es decir, que permiten la recuperación de la clave. En tiempos era muy frecuente que las claves se guardaran en la base de datos de manera directa, es decir, “mi_clave69” aparecía en la base de datos como “mi_clave69”. Mas tarde, viendo que esto algunas veces generaba problemas de confidencialidad a alguien se le ocurrió la idea de alargar las claves, y viendo que esto para los usuarios también era un problema, se paso a guardar “mi_clave69” como “ave69mi_cl”, lo cual fue una mejora, y ya tenias que poner atención para recordar la clave, aunque era fácilmente deducible. Pero vayamos al caso, veamos como podemos hacer esto, vamos a crear nuestro propio método de encriptación o codificación, y además, reversible, decodificable.

Invertir el orden de caracteres de una cadena es algo muy sencillo, tanto como usar la función nativa strrev(), esta función te convierte “hola” en “aloh”, pero vamos a hacerlo un poco mas complicado.

Lo primero que tenemos que hacer es dividir la cadena de caracteres en dos partes, para lo que debemos tener en cuenta si el número de caracteres es par o impar, ya que en el segundo caso, una parte tendrá un carácter mas que la otra.

Teniendo en cuenta esto, usamos la función floor() y ceil() para redondear al valor superior para una parte y al inferior para la otra. Estas dos partes las cambiamos de posición, la que aparece en primera posición la ponemos en segunda posición, y la que aparece en segunda posición pasa a la primera. Unimos estas dos partes con el concatenador punto (.) y ya hemos unido las dos variables. Seguidamente usamos la función strrev() e invertimos el orden de los caracteres.

Así la clave o password pasaría de “mi_clave69” a “96evalc_im”, de esta manera, la clave se hace menos evidente, aún siendo una clave con cierto valor semántico.

El código seria el siguiente:


<?php
// Codificacion de una clave

$clave = 'mi_clave69'; // Clave a codificar

$n = strlen($clave); // Contamos numero de caracteres

$par = $n % 2; // Comprobamos si el valor es par con % que da el resto de la division

if($par == 0){
// El numero de caracteres es par
$nc = $n / 2;

$parte1 = substr($clave, -$nc); // Extraemos los x caracteres de la derecha
$parte2 = substr($clave, 0,$nc); // Extraemos los x primeros caracteres de la izquierda
}else{
// El numero de caracteres es impar
$nc1 = floor($n / 2); // Redondea al entero por debajo de el
$nc2 = ceil($n / 2); // Redondea al entero por encima de el

$parte1 = substr($clave, 0,$nc1); // Extraemos los x primeros caracteres de la izquierda
$parte2 = substr($clave, -$nc2); // Extraemos los x caracteres de la derecha
}

$clave_cod = strrev($parte2.$parte1); // Con strrev invertimos el orden de los caracteres

echo "<p>Clave original: <b>$clave</b> <br />
$parte1 | $parte2 <br />
Clave codificada: $clave_cod; <br />
</p>";

// ===========================================
// Descodificacion de la clave codificada

$n = strlen($clave_cod);

$par = $n % 2;

if($par == 0){
// El numero de caracteres es par
$nc = $n / 2;

$parte1 = substr($clave_cod, 0, $nc); // Extraemos los x primeros caracteres de la izquierda
$parte2 = substr($clave_cod, -$nc); // Extraemos los x caracteres de la derecha
}else{
// El numero de caracteres es impar
$nc1 = ceil($n / 2); // Redondea al entero por debajo de el
$nc2 = floor($n / 2); // Redondea al entero por encima de el

$parte1 = substr($clave_cod, -$nc1); // Extraemos los x caracteres de la derecha
$parte2 = substr($clave_cod, 0, $nc2); // Extraemos los x primeros caracteres de la izquierda
}

$clave_des = strrev($parte1.$parte2); // Con strrev invertimos el orden de los caracteres

echo "<hr>
<p>Clave codificada: <b>$clave_cod</b> <br />
$parte1 | $parte2 <br />
Clave descodificada: $clave_des; <br />
</p>";
?>


Hemos puesto como ejemplo la codificación de claves, pero podríamos hacer lo mismo con un e-mail, pero entonces nos enfrentaríamos a un problema, la @ siempre aparecería, siempre delataría la existencia de una cuenta de e-mail. Para evitar esto, podríamos por ejemplo codificar el resultado codificada en notación hexadecimal.

El código seria el siguiente:


<?php
// Codificacion de una clave
// Cargamos las funciones de codificacion hexadecimal

// En la codificacion hexadecimal se dobla la longitud de la cadena

// Codifica cadena a hexadecimal
function Codf_Hexad($cadena){
$Cod_hexad = null;
for ($i=0; $i<strlen($cadena); $i++){
$ord = ord($cadena[$i]);
$hexCode = dechex($ord);
$Cod_hexad .= substr('0'.$hexCode, -2);
}
return strToUpper($Cod_hexad);
}
//--------------
// Decodifica hexadecimal a la cadena original
function Decod_Hexad($hex){
$decHexa = null;
for ($i=0; $i < strlen($hex)-1; $i+=2){
$decHexa .= chr(hexdec($hex[$i].$hex[$i+1]));
}
return $decHexa;
}
//-------------- FIN FUNCIONES
// ===============================================
// ===============================================
// ===============================================

$clave = 'mi_clave69'; // Clave a codificar

$n = strlen($clave); // Contamos numero de caracteres

$par = $n % 2; // Comprobamos si el valor es par con % que da el resto de la division

if($par == 0){
// El numero de caracteres es par
$nc = $n / 2;

$parte1 = substr($clave, -$nc); // Extraemos los x caracteres de la derecha
$parte2 = substr($clave, 0,$nc); // Extraemos los x primeros caracteres de la izquierda
}else{
// El numero de caracteres es impar
$nc1 = floor($n / 2); // Redondea al entero por debajo de el
$nc2 = ceil($n / 2); // Redondea al entero por encima de el

$parte1 = substr($clave, 0,$nc1); // Extraemos los x primeros caracteres de la izquierda
$parte2 = substr($clave, -$nc2); // Extraemos los x caracteres de la derecha
}

$clave_cod = strrev($parte2.$parte1); // Con strrev inverimos el orden de los caracteres

// Ejecutamos la funcion
$clave_hexad = Codf_Hexad($clave_cod);

echo "<p>Clave original: <b>$clave</b> <br />
$parte1 | $parte2 <br />
Clave codificada: $clave_cod; <br />
Clave Hexadecimal: $clave_hexad
</p>";

// ===========================================
// Descodificacion de la clave codificada

$decod_hexad = Decod_Hexad($clave_hexad);

$n = strlen($decod_hexad);

$par = $n % 2;

if($par == 0){
// El numero de caracteres es par
$nc = $n / 2;

$parte1 = substr($clave_cod, 0, $nc); // Extraemos los x primeros caracteres de la izquierda
$parte2 = substr($clave_cod, -$nc); // Extraemos los x caracteres de la derecha
}else{
// El numero de caracteres es impar
$nc1 = ceil($n / 2); // Redondea al entero por debajo de el
$nc2 = floor($n / 2); // Redondea al entero por encima de el

$parte1 = substr($clave_cod, -$nc1); // Extraemos los x caracteres de la derecha
$parte2 = substr($clave_cod, 0, $nc2); // Extraemos los x primeros caracteres de la izquierda
}

$clave_des = strrev($parte1.$parte2); // Con strrev invertimos el orden de los caracteres

echo "<hr>
<p>Clave codificada: <b>$clave_hexad</b> <br />
$parte1 | $parte2 <br />
Clave descodificada: $clave_des <br />
</p>";

?>


Espero que este capitulo os haya resultado interesante de cara a aplicar procedimientos de seguridad para vuestros sitios Web. Debo añadir que el procedimiento seguido es uno entre los muchos posibles, te invitamos a usar otros procedimientos para transformar, codificar los valores y darle el uso que preciséis. Yo lo he ejemplificado con una clave, que en este último caso “mi_clave69” se guardaría en la base de datos como “39366576616C635F696D”.

Ahora ya queda en vuestra mano, además de los posibles cambios antedichos, que convirtáis todo este código en una función para que podáis aplicarlo de manera sencilla tanto a la hora de guardarlo, como a la hora de extraerlo de la base de datos.
Tags: codificación || decodificación || encriptación || strrev || hexadecimal || función

Comentarios.

Sin comentarios, publica el tuyo.