Проблема с сериализацией / десериализацией и mcrypt при выполнении подписанных файлов cookie - PullRequest
0 голосов
/ 25 марта 2011

Я работаю с другом, чтобы получить подписанные куки на веб-сайте, но у меня много проблем при попытке зашифровать его с помощью mcrypt и MCRYPT_RIJNDAEL_256.У меня куки работают нормально, поэтому проблема только в том, что при шифровании / дешифровании значения куки.

Вот ошибка, которая появляется при попытке расшифровать куки:

Notice: unserialize(): Error at offset 0 of 93 bytes in /var/samba/www/xxx/src/data/include/yyy/Cookie.php on line 94

Эта точная строка соответствует:

$this->_cookie["value"] =  unserialize(mdecrypt_generic($tv, $cookie_value));

А вот как мне удается зашифровать / расшифровать.

Сначала отправьте куки.

    $tv = mcrypt_module_open(MCRYPT_RIJNDAEL_256, null, "ctr", null);
    $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($tv), MCRYPT_RAND);
    mcrypt_generic_init($tv, "t3stp4ssw0rd", $iv);

    $this->_cookie["value"] =  base64_encode(mcrypt_generic($tv, serialize($this->_cookie["value"])));

    mcrypt_generic_deinit($tv);
    mcrypt_module_close($tv);

    setrawcookie($this->_cookie["name"],
                 $this->_cookie["value"],
                 $this->_cookie["expire"],
                 $this->_cookie["path"],
                 $this->_cookie["domain"],
                 $this->_cookie["secure"],
                 $this->_cookie["httponly"]);

PD: Да, прекрасный тестовый пароль; -)

Значение, которое я вижу в firebug для cookie:

oKWdbVLX9T+mbOut4swo/aXr0g5O/3ApqfWZ1GZlrwwMSTa+M4n8Uey0UQs827HB7tilc/OzUPWQxoNvnAIkP5CFGkvgn+j+I36qN6dB0HmOUPlkNXJlz8Tfqxrjf8Gx

My get cookie, гдеЯ должен расшифровать значение:

    $this->_cookie["name"] = $cookie_name;
    $this->_cookie["value"] = $_COOKIE[$cookie_name];

    $cookie_value = base64_decode($this->_cookie["value"]);

    $tv = mcrypt_module_open(MCRYPT_RIJNDAEL_256, null, "ctr", null);
    $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($tv), MCRYPT_RAND);
    mcrypt_generic_init($tv, "t3stp4ssw0rd", $iv);

    $this->_cookie["value"] =  unserialize(mdecrypt_generic($tv, $cookie_value));

    mcrypt_generic_deinit($tv);
    mcrypt_module_close($tv);

    return $_COOKIE[$cookie_name];

Проблема в том, когда я пытаюсь десериализовать значение дешифрованных данных.Кто-нибудь знает, в чем может быть проблема?

Заранее спасибо!

ОБНОВЛЕНИЕ:

    $cookie_value = base64_decode($this->_cookie["value"]);

    $td = mcrypt_module_open(MCRYPT_RIJNDAEL_256, "", "cfb", "");
    $ks = mcrypt_enc_get_key_size($td);
    $key = substr(sha1("t3stp4ssw0rd"), 0, $ks);

    $ivs = mcrypt_enc_get_iv_size($td);
    $iv = substr($cookie_value, 0, $ivs);

    $cookie_value = substr($cookie_value, $ivs);

    mcrypt_generic_init($td, $key, $iv);

    $cookie_value = mdecrypt_generic($td, $cookie_value);

    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);

    $this->_cookie["value"] =  unserialize($cookie_value);

Возвращает мне ошибку Warning: mcrypt_generic_init(): Iv size incorrect; supplied length: 0, needed: 32

Ответы [ 2 ]

2 голосов
/ 25 марта 2011

Эта ошибка смещения обычно означает, что длина одного из значений не соответствует указанной длине, обозначенной в сериализованных данных.По моему опыту, это обычно сводится к:

  • , как сказал предыдущий автор, с обратной косой чертой вставляются экранирующие символы
  • Проблемы с кодировкой.Обычно это происходит, когда некоторые символы вычисляются как имеющие один байт при сериализации, но при десериализации они внезапно имеют 2 байта.Это может произойти, когда у вас есть, скажем, набор символов ISO-8859-1, но затем какая-то операция меняет его на UTF-8.

Если бы я угадал, я бы сказал,что вторая точка, вероятно, в том, где ваша проблема.Ваша процедура в первом случае - serialize-> encrypt-> base64_encode, затем вы переворачиваете последовательность, но я подозреваю, что где-то вдоль строки ваша кодировка символов испортилась.

Отредактировано: Хорошо, я посмотрел на ваш код, и возникла проблема с вашим шифрованием / дешифрованием.Ваша расшифровка не возвращает обратно дешифрованное значение.Некоторое время назад я натолкнулся на эту функцию (хотел бы я вспомнить, где я могу правильно ее приписать), которую я использую для Mcrypt.Он работает как для кодирования, так и для декодирования.Попробуйте и посмотрите, решит ли это вашу проблему (единственное, что он не делает, это ваш base64_encode).Я думаю, что ваша проблема заключалась в том, что вы пропустили некоторые необходимые шаги.

function encDec( $data, $key, $encrypt=true, $cypher='rijndael-128') {

    if (function_exists('mcrypt_module_open')) {

        # Serialize, if encrypting
        if ( $encrypt ) { $data = serialize($data); } 

        # Open cipher module
        if ( ! $td = mcrypt_module_open($cypher, '', 'cfb', '') )
            return false;

        $ks = mcrypt_enc_get_key_size($td);     # Required key size
        $key = substr(sha1($key), 0, $ks);      # Harden / adjust length

        $ivs = mcrypt_enc_get_iv_size($td);     # IV size

        $iv = $encrypt ?
            mcrypt_create_iv($ivs, MCRYPT_RAND) :   # Create IV, if encrypting
            substr($data, 0, $ivs);                 # Extract IV, if decrypting

        # Extract data, if decrypting
        if ( ! $encrypt ) $data = substr($data, $ivs);

        if ( mcrypt_generic_init($td, $key, $iv) !== 0 ) # Initialize buffers
            return false;

        $data = $encrypt ?
            mcrypt_generic($td, $data) :    # Perform encryption
            mdecrypt_generic($td, $data);   # Perform decryption

        if ( $encrypt ) $data = $iv . $data;    # Prepend IV, if encrypting

        mcrypt_generic_deinit($td);             # Clear buffers
        mcrypt_module_close($td);               # Close cipher module

        # Unserialize, if decrypting
        if ( ! $encrypt ) $data = unserialize($data);

    }

    return $data;
}
0 голосов
/ 25 марта 2011

Убедитесь, что кавычки " в информации о cookie не экранированы с помощью обратной косой черты.Если они цитируются, удалите их перед шифрованием.Смотрите эту ветку -> Ошибка несериализации PHP со смещением, работает на некоторых серверах, а не на других

...