CodeIgniter User Guide Version 2.0.0


Класс Encryption (шифрование)

Класс Encryption обеспечивает двустороннее шифрование данных. Он использует схему, которая либо обрабатывает сообщение, используя случайно хешированную схему кодирования XOR, или шифрует, используя библиотеку Mcrypt. Если Mcrypt недоступна на вашем сервере, закодированное сообщение будет по-прежнему поддерживать некоторую степень безопасности. Если Mcrypt доступна, уровень безопасности будет высоким.

Установка своего ключа

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

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

Для того, чтобы получить максимум преимуществ от алгоритмов шифрования, ваш ключ должен состоять из 32 символов (128бит). Ключ должен быть случайным, с цифрами и буквами в верхнем и нижнем регистрах. Ключ не должен быть простой строкой текста. Он должен быть настолько случайным, насколько это возможно.

Ваш ключ может храниться в файле application/config/config.php, или вы можете разработать собственный динамический механизм его хранения.

Для того, чтобы сохранить ключ в application/config/config.php, откройте файл и запишите:

$config['encryption_key'] = "YOUR KEY";

Длина сообщения

Это важно, так как длина зашифрованного сообщения более чем в 2,6 раз больше, чем оригинального. Например, если вы кодируете строку "my super secret data", длиной в 21 символ, вы получить зашифрованную строку длиной примерно 55 символов. Мы говорим "примерно", так как длина закодированной строки увеличивается 64-битными кластерами, поэтому увеличение происходит не совсем линейно. Помните об этом, когда вы будете выбирать механизм хранения данных. К примеру, куки (cookies) могут хранить только 4 килобайта информации.

Инициализация класса

Как и большинство других классов в CodeIgniter, класс Encryption инициализируется в вашем контроллере с помощью функции $this->load->library:

$this->load->library('encrypt');

Загруженный объект Encrypt будет доступен как $this->encrypt

$this->encrypt->encode()

Шифрование данных возвращает строку. Пример:

$msg = 'My secret message';

$encrypted_string = $this->encrypt->encode($msg);

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

$msg = 'My secret message';
$key = 'super-secret-key';

$encrypted_string = $this->encrypt->encode($msg, $key);

$this->encrypt->decode()

Раскодирует зашифрованную строку. Пример:

$encrypted_string = 'APANtByIGI1BpVXZTJgcsAG8GZl8pdwwa84';

$plaintext_string = $this->encrypt->decode($encrypted_string);

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

$msg = 'My secret message';
$key = 'super-secret-key';

$encrypted_string = $this->encrypt->decode($msg, $key);

$this->encrypt->set_cipher();

Разрешает вам установить шифр Mcrypt. По умолчанию используется MCRYPT_RIJNDAEL_256. Пример:

$this->encrypt->set_cipher(MCRYPT_BLOWFISH);

Посетите php.net для того, чтобы получить список доступных шрифтов.

Если вы желаете вручную протестировать поддержку Mcrypt вашим сервером, используйте:

echo ( ! function_exists('mcrypt_encrypt')) ? 'Nope' : 'Yup';

$this->encrypt->set_mode();

Позволяет вам установить режим Mcrypt. По умолчанию используется MCRYPT_MODE_CBC. Пример:

$this->encrypt->set_mode(MCRYPT_MODE_CFB);

Посетите php.net для того, чтобы получить список доступных режимов.

$this->encrypt->sha1();

Функция кодирования SHA1. Возвращает строку с 160-битным односторонним хешем. Примечание: SHA1, как и MD5 — не декодируются. Пример:

$hash = $this->encrypt->sha1('Some string');

Множество инсталляций PHP имеют поддержку SHA1 по умолчанию, поэтому, если вам необходимо закодировать строку, используйте нативные функции:

$hash = sha1('Some string');

Если ваш сервер не поддерживает SHA1, вы можете использовать предоставленные функции.

$this->encrypt->encode_from_legacy($orig_data, $legacy_mode = MCRYPT_MODE_ECB, $key = '');

Позволяет перекодировать данные, которые были закодированы CodeIgniter 1.x в формат, совместимый с библиотекой Encryption в CodeIgniter 2.x. Нужно использовать этот метод, если у вас есть данные, зашифрованные и хранящиеся в файлах или в БД, на сервере с поддержкой Mcrypt. "Легкое" использование, к примеру, хранение данных в сессии, не требует вмешательства с вашей стороны. Тем не менее, существующие зашифрованные сессии будут уничтожены при миграции.

Почему рассматривается только метод перекодирования данных, а не сохранение наследия методов для кодирования и декодирования? Алгоритмы библитеки Encryption в CodeIgniter 2.x улучшены, как в производительности, так и в безопасности, поэтому мы не хотим поощрять использование старых методов. Конечно, вы можете расширить библиотеку Encryption, если вы хотите совместить новые методы со старыми, но это решение, которое разработчик должен делать обдуманно и достаточно осторожно.

$new_data = $this->encrypt->encode_from_legacy($old_encrypted_string);
Параметр По умолчанию Описание
$orig_data n/a Зашифрованные данные из библиотеки CodeIgniter 1.x's Encryption
$legacy_mode MCRYPT_MODE_ECB Режим Mcrypt, который был использован при шифровании оригинальных данных. CodeIgniter 1.x' по умолчанию использовал MCRYPT_MODE_ECB.
$key n/a Шифрующий ключ. Обычно он указан в файле конфигурации, как описано выше.