Как мы можем использовать шифрование режима GCM в PHP?

Я много читал о GCM и насколько это потрясающе, и я хотел бы знать, как использовать аутентифицированное шифрование AES-GCM с использованием PHP . Поддерживается ли она в mcrypt() ? Я нашел некоторые ссылки на GCM в документационной документации Codeigniter, что заставляет меня полагать, что это можно использовать в Codeigniter .

И я также наткнулся на что-то в доке о Зенде . Я не хочу использовать драйвер Codeigniter, хотя я не использую никаких фреймворков и не собираюсь использовать мои текущие проекты. Однако мне кажется, что, если Codeigniter сможет это сделать, мы должны иметь возможность без рамки.

Кажется, что GCM – это способ пойти как на безопасность, так и на производительность (я видел очень впечатляющие показатели производительности). Я чувствую, что нам это нужно, но я не могу найти примеров. Кто-то должен иметь представление о том, как это сделать. Я знаю, что это поддерживается OpenSSL .

Любая помощь будет оценена.

Здесь вы задаете несколько вопросов, поэтому я буду обращаться к ним отдельно, как указано выше:

Поддерживается ли она в mcrypt ()?

Нет, mcrypt не поддерживает шифрование AES как таковое. Тем не менее, он поддерживает Rijndael (произносится как «кукла дождя»), который является базовым алгоритмом для AES. AES определяется как определенный набор параметров для Rijndael, поэтому вы можете использовать соответствующие параметры для соответствия AES, но режим GCM недоступен.

Кажется, что GCM – это способ пойти как на безопасность, так и на производительность (я видел очень впечатляющие показатели производительности). Я чувствую, что нам это нужно, но я не могу найти примеров.

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

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

Поскольку вы упоминаете статистику производительности для AES-GCM, да, она очень хорошо работает на современных процессорах (i7 и новее), которые имеют аппаратную поддержку, специально разработанную для ускорения необходимых операций. Если ваш сервер или клиенты не имеют аппаратного ускорения, AES-GCM будет намного медленнее . В дополнение к реальной аппаратной поддержке используемая вами библиотека программного обеспечения является ключевой, так как она должна будет использовать необходимое оборудование, чтобы воспользоваться повышенной скоростью.

Я знаю, что это поддерживается OpenSSL.

OpenSSL – одна из таких библиотек, которые реализуют AES-GCM, и это выгодно, если AES-NI (технология аппаратного ускорения), когда она доступна.

Плохая новость заключается в том, что расширения PHP, доступные сегодня (начало февраля 2015 года), не поддерживают конкретную библиотеку, которая реализует AES-GCM. Попытка использования GCM связана с недавними уязвимостями, обнаруженными в протоколе SSL, которые, наконец, заставляют всех переходить на TLS и в режим шифрования с аутентификацией. Даже несмотря на то, что эксперты в области безопасности на протяжении многих лет настаивали на таком движении, как производители серверов, так и браузеры заставляли их ждать друг друга, чтобы сделать первые шаги в направлении аутентифицированного шифрования. Мы, наконец, начинаем видеть движение в правильном направлении.

Я полагаю, что в конце этого года мы, наконец, получим AES-GCM в PHP, но пока это не доступно.

Некоторые источники информации: http://wiki.openssl.org/index.php/EVP_Authenticated_Encryption_and_Decryption. Показывает библиотеку EVP. Высокоуровневая реализация AES-GCM, которая использует AES-NI

http://phpaes.com Реализация AES для PHP. Я не знаю, были ли они проверены надлежащим образом, или если они используют аппаратное ускорение. Они не предлагают GCM, но это может быть хороший инструмент обучения.

Вы можете установить режим в качестве параметра для функции инициализации:

 $this->encryption->initialize( array('mode' => 'gcm') ); 

для использования этого кода вы, конечно, используете ci и его классы шифрования

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

вы также можете изменить шифр, драйвер и ключ внутри метода initialize – для получения дополнительной информации см. http://www.storycon.us/ci3/libraries/encryption.html#id11

OpenSSL не будет работать корректно, поскольку AEAD не поддерживается для всех версий до PHP 7.1.

Вы можете использовать эту библиотеку: https://github.com/Spomky-Labs/php-aes-gcm

Это чистая библиотека PHP. Шифрование / Расшифровка может быть медленнее, чем расширение PHP, но оно выполняет эту работу. Эта библиотека также тестируется с использованием тестовых векторов из NIST.