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


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

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

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

Любая помощь будет очень признательна.

Author: GingerHead, 2014-07-02

3 answers

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

Поддерживается ли это в 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, но это может быть хорошим инструментом обучения.

 5
Author: Security Aficionado, 2015-02-10 16:52:10

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

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

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

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

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

 2
Author: Philipp, 2014-07-03 10:52:41

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

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

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

 1
Author: Florent Morselli, 2016-04-28 14:13:57