Почему kohana 3 Encrypt class метод encode () каждый раз возвращает разные строки? - PullRequest
3 голосов
/ 16 декабря 2011

Я делаю encode() из класса Encrypt, и каждый раз он возвращает разные строки для одной и той же входной строки. Мой application/config/encrypt.php:

return array(
    'default' => array(
        /**
         * The following options must be set:
         *
         * string   key     secret passphrase
         * integer  mode    encryption mode, one of MCRYPT_MODE_*
         * integer  cipher  encryption cipher, one of the Mcrpyt cipher constants
         */
        'cipher' => MCRYPT_RIJNDAEL_128,
        'key'    => 'df58e28f',
        'mode'   => MCRYPT_MODE_NOFB,
    ),
);

Использование:

$str = Encrypt::instance()->encode('test');

$str всегда имеет другое значение. Это ошибка или она должна работать именно так? Почему?

Также я должен добавить, что всегда могу decode() это значение и каждый раз получать строку test.

ОБНОВЛЕНИЕ: Вот пример вывода: 0vahDa/2Qu3XQWObkjwLPoL73g==

Большое спасибо.

Ответы [ 2 ]

2 голосов
/ 01 февраля 2013

Причина, по которой он каждый раз отличается, заключается в том, что когда вызывается encode(), для шифрования данных используется новый случайный IV.Вот строка, которая делает это:

// Create a random initialization vector of the proper size for the current cipher
$iv = mcrypt_create_iv($this->_iv_size, Encrypt::$_rand);

Затем он в конечном итоге возвращает строку в кодировке Base 64, состоящую из зашифрованных данных и IV.

// Use base64 encoding to convert to a string
return base64_encode($iv.$data);

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

1 голос
/ 07 января 2012

На самом деле это намеренное поведение.

ИМХО, таким образом, шифрование более безопасно.Большинство псевдо-хакеров считают, что разные зашифрованные значения означают разные фактические значения.

Важно то, что вы всегда получаете одно и то же значение при расшифровке.

Вы должны быть осторожны с этим: если вы хотите использовать одну и ту же зашифрованную строку дважды, вы должны хранить ее отдельнопотому что повторное шифрование не приведет к тому же самому.

...