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

#php #encryption #aes #mcrypt #aes-gcm

#php #шифрование #aes #mcrypt #aes-gcm

Вопрос:

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

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

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

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

Комментарии:

1. Извините, но GCM не работает с PHP. Если вам нужен режим AEAD, ознакомьтесь с libsodium .

2. Спасибо. В итоге я использовал libsodium в своем коде. Это очень просто.

Ответ №1:

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

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

Нет, mcrypt не поддерживает шифрование AES как таковое. Однако он поддерживает Rijndael (произносится как «rain-doll»), который является базовым алгоритмом для 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, но это может быть хорошим инструментом обучения.

Ответ №2:

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

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

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

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

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

Комментарии:

1. Пожалуйста, уточните, что ваш ответ касается библиотеки шифрования CodeIgniter. Не сразу понятно, иначе почему существует encryption свойство на this и кто именно поддерживает gcm режим.

2. @OlegEstekhin Я думал, это было ясно, потому что автор ссылался на соответствующую страницу ci docu

Ответ №3:

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

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

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