Leer cookie encriptada de CodeIgniter desde PHP

Recientemente tuve que vincular una nueva aplicación en Laravel con una aplicación existente en CodeIgniter 2.*, y se hizo necesario poder leer la cookie generada por CodeIgniter desde Laravel para identificar la sesión.

Si inspeccionamos el contenido de una cookie encriptada desde CI vemos que contiene un string largo con letras y números. Para poder ver su contenido, suponiendo que para la encriptación se usó mcrypt, podemos usar la función decode($string, $key) de la siguiente clase:
donde $string es el contenido de la cookie que se quiere desencriptar y $key es la llave que uso CI para encriptar la cookie.

<?php


class CodeIgniterService
{
    function decode($string, $key = '')
    {
        $key = md5($key);

        if (preg_match('/[^a-zA-Z0-9\/\+=]/', $string)) {
            return FALSE;
        }

        $dec = base64_decode($string);

        if (($dec = $this->mcrypt_decode($dec, $key)) === FALSE) {
            return FALSE;
        }

        return $dec;
    }

    function mcrypt_decode($data, $key)
    {
        $data = $this->_remove_cipher_noise($data, $key);
        $init_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);

        if ($init_size > strlen($data)) {
            return FALSE;
        }

        $init_vect = substr($data, 0, $init_size);
        $data = substr($data, $init_size);
        return rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $data, MCRYPT_MODE_CBC, $init_vect), "\0");
    }

    function _remove_cipher_noise($data, $key)
    {
        $keyhash = sha1($key);
        $keylen = strlen($keyhash);
        $str = '';

        for ($i = 0, $j = 0, $len = strlen($data); $i < $len; ++$i, ++$j) {
            if ($j >= $keylen) {
                $j = 0;
            }

            $temp = ord($data[$i]) - ord($keyhash[$j]);

            if ($temp < 0) {
                $temp = $temp + 256;
            }

            $str .= chr($temp);
        }

        return $str;
    }
}

Una vez desencriptada la cookie tendremos un string que representa un array serializado, para convertirlo de nuevo a array se usa la función unserialize de PHP

Ejemplo de uso:

$data = $_COOKIE['cookiename'];
$key = "39243aea6c47f20094700557ce39a13d";

$CIService = new CodeIgniterService();
$data = $CIService->decode($data, $key);
print_r(unserialize($data));
die();

Deja un comentario

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