PHP 8.4: Sodium: Поддержка AEGIS-128L и AEGIS256
- Новые функции и PHP константы
- Проверка доступности AEGIS-128L и AEGIS-256
- Примеры использования
AEGIS-128L
иAEGIS-256
- Влияние на обратную совместимость
Расширение PHP 8.4 Sodium поддерживает AEGIS-128L
и AEGIS256
с помощью функций PHP, которые следуют шаблону _keygen
, _encrypt
и _decrypt
по тому же шаблону, что и существующие алгоритмы шифрования aes256gcm
, chacha20poly1305
, chacha20poly1305_ietf
и xchacha20poly1305
. Все они являются алгоритмами Аутентифицированного Шифрования с Дополнительными Данными (AEAD).
Шифрование AEGIS с помощью расширения PHP Sodium
Расширение Sodium в PHP 8.4 теперь поддерживает шифры AEGIS-128L и AEGIS-256 Authenticated Encryption. Они значительно быстрее, чем AES-GCM и CHACHA20-POLY1305. В этой статье мы сравним их и объясним, как безопасно шифровать и расшифровывать данные с помощью AEGIS-128L и AEGIS256 на PHP.
Новые функции и PHP константы
Расширение Sodium в PHP 8.4 добавляет шесть новых функций PHP и четыре новые PHP константы для алгоритмов AEGIS-128L
и AEGIS-256
AEAD.
Функции и константы AEGIS-128L
AEGIS-128L
— это алгоритм AEAD, принимающий 128-битный ключ и 128-битное значение nonce и способный шифровать/дешифровать данные размером менее 2*64 бит.
- Константа
SODIUM_CRYPTO_AEAD_AEGIS128L_KEYBYTES
: количество байт, необходимых для значения ключа, используемого алгоритмомAEGIS-128L
. Значение16
. - Константа
SODIUM_CRYPTO_AEAD_AEGIS128L_NPUBBYTES
: количество байт, необходимых для значения nonce, используемого алгоритмомAEGIS-128L
. Значение16
. - Функция
sodium_crypto_aead_aegis128l_keygen
: Генерирует и возвращает криптографически защищённое случайное число требуемой длины (SODIUM_CRYPTO_AEAD_AEGIS128L_KEYBYTES
) дляAEGIS-128L
. - Функция
sodium_crypto_aead_aegis128l_encrypt
: Шифрует и аутентифицирует данные в виде простого текста с помощьюAEGIS-128L
. - Функция
sodium_crypto_aead_aegis128l_decrypt
: Проверяет и затем расшифровывает сообщение с помощьюAEGIS-128L
.
Синопсис функции sodium_crypto_aead_aegis128l_keygen
/**
* Генерация случайного ключа AEGIS-128L
* @return string
*/
function sodium_crypto_aead_aegis128l_keygen(): string
Синопсис функции sodium_crypto_aead_aegis128l_encrypt
/**
* Шифрование с последующей аутентификацией с помощью AEGIS-128L.
* @param string $message Сообщение для шифрования в виде обычного текста.
* @param string $additional_data Дополнительные, аутентификационные данные. Эти данные используются при проверке аутентификационного тега, добавляемого к шифротексту, но они не шифруются и не хранятся в шифротексте.
* @param string $nonce Число, которое должно быть использовано только один раз в одном сообщении. Длина 16 байт.
* @param string $key Ключ шифрования (128 бит).
* @return string Зашифрованный шифротекст
*/
function sodium_crypto_aead_aegis128l_encrypt(string $message, string $additional_data, string $nonce, string $key): string
Синопсис функции sodium_crypto_aead_aegis128l_decrypt
/**
* Проверьте, а затем расшифруйте сообщение с помощью AEGIS-128L.
* @param string $message Зашифрованное сообщение, созданное функцией sodium_crypto_aead_aegis128l_encrypt().
* @param string $additional_data Дополнительные, аутентифицированные данные. Используется для проверки тега аутентификации, добавляемого к шифротексту, но не шифруется и не хранится в шифротексте. Это должно быть то же значение, которое было передано при шифровании открытого текста.
* @param string $nonce Число, которое должно быть использовано только один раз в одном сообщении. Длина 16 байт. Это должно быть то же самое значение nonce, которое было передано при шифровании сообщения с открытым текстом.
* @param string $key Ключ шифрования (128 бит).
* @return string Дешифрованный текст
*/
function sodium_crypto_aead_aegis128l_decrypt(string $message, string $additional_data, string $nonce, string $key): string
Функции и константы AEGIS-256
- Константа
SODIUM_CRYPTO_AEAD_AEGIS256_KEYBYTES
: количество байт, необходимых для значения ключа, используемого алгоритмомAEGIS-256
. Значение 32. - Константа
SODIUM_CRYPTO_AEAD_AEGIS256_NPUBBYTES
: количество байт, необходимых для значения nonce, используемого алгоритмомAEGIS-256
. Значение 32. - Функция
sodium_crypto_aead_aegis256_keygen
: Генерирует и возвращает криптографически защищённое случайное число требуемой длины (SODIUM_CRYPTO_AEAD_AEGIS256_KEYBYTES
) для AEGIS-256. - Функция
sodium_crypto_aead_aegis256_encrypt
: Шифрует и аутентифицирует данные в виде обычного текста с помощьюAEGIS-256
. - Функция
sodium_crypto_aead_aegis256_decrypt
: Проверяет и затем расшифровывает сообщение с помощьюAEGIS-256
.
Синопсис функции sodium_crypto_aead_aegis256_keygen
/**
* Generate a random AEGIS-256 key
* @return string
*/
function sodium_crypto_aead_aegis256_keygen(): string
Синопсис функции sodium_crypto_aead_aegis256_encrypt
/**
* Шифрование и последующая аутентификация с помощью AEGIS-256.
* @param string $message Сообщение для шифрования в виде обычного текста.
* @param string $additional_data Дополнительные, аутентификационные данные. Эти данные используются при проверке аутентификационного тега, добавляемого к шифротексту, но они не шифруются и не хранятся в шифротексте.
* @param string $nonce Число, которое должно быть использовано только один раз в одном сообщении. Длина 32 байта.
* @param string $key Ключ шифрования (256 бит).
* @return string Зашифрованный шифротекст
*/
function sodium_crypto_aead_aegis256_encrypt(string $message, string $additional_data, string $nonce, string $key): string
Синопсис функции sodium_crypto_aead_aegis256_decrypt
/**
* Проверка и последующая расшифровка сообщения с помощью AEGIS-256.
* @param string $message Зашифрованное сообщение, созданное функцией sodium_crypto_aead_aegis256_encrypt().
* @param string $additional_data Дополнительные, аутентификационные данные. Используется для проверки аутентификационного тега, добавляемого к шифротексту, но не шифруется и не хранится в шифротексте. Это должно быть то же значение, которое было передано при шифровании обычного текста.
* @param string $nonce Число, которое должно быть использовано только один раз в одном сообщении. Длина 32 байта. Это должно быть то же самое значение nonce, которое было передано при шифровании сообщения с открытым текстом.
* @param string $key Ключ шифрования (256 бит).
* @return string Дешифрованный текст
*/
function function sodium_crypto_aead_aegis256_decrypt(string $ciphertext, string $additional_data, string $nonce, string $key): string|false
Проверка доступности AEGIS-128L и AEGIS-256
Не существует специальной функции, подобной sodium_crypto_aead_aes256gcm_is_available
, которая бы возвращала, доступны ли алгоритмы AEGIS-128L
и AEGIS-256
AEAD.
Однако новые функции и константы объявляются только в том случае, если выполнены все требования. Для этого требуется процессор x86_64
или aarch64
, PHP 8.4 и расширение Sodium, скомпилированное с libsodium
версии 1.0.19 или более поздней. Проверка доступности одной из новых функций служит проверкой доступности этих алгоритмов:
function_exists('sodium_crypto_aead_aegis256_encrypt') {
// AEGIS-128L доступен.
}
Примеры использования AEGIS-128L
и AEGIS-256
Подробную информацию и бенчмарки этих двух алгоритмов AEAD смотрите в статье Шифрование AEGIS с расширением PHP Sodium.
Ниже приведены примеры, демонстрирующие использование двух новых алгоритмов шифрования.
AEGIS-128L
// генерируем случайный ключ достаточной длины (16 байт)
// Это значение не должно быть публичным.
$key = sodium_crypto_aead_aegis128l_keygen();
// Генерируем случайное значение nonce длины SODIUM_CRYPTO_AEAD_AEGIS128L_NPUBBYTES (16 байт).
// Это значение должно храниться вместе с зашифрованным текстом, но не обязательно должно быть приватным
$nonce = random_bytes(SODIUM_CRYPTO_AEAD_AEGIS128L_NPUBBYTES);
// Дополнительные данные. Это может быть ID пользователя, e-mail или пустое значение.
$additional_data = '';
// Сообщение, которое нужно зашифровать
$message = 'Hello';
// Шифрование
$ciphertext = sodium_crypto_aead_aegis128l_encrypt($message, $additional_data, $nonce, $key);
// Дешифрование
$decryptedMessage = sodium_crypto_aead_aegis128l_decrypt($ciphertext, $additional_data, $nonce, $key); // "Hello"
AEGIS-256
// генерируем случайный ключ достаточной длины (32 байта)
// Это значение не должно быть публичным.
$key = sodium_crypto_aead_aegis256_keygen();
// Сгенерируйте случайное значение nonce длины SODIUM_CRYPTO_AEAD_AEGIS128L_NPUBBYTES (32 байта).
// Это значение должно храниться вместе с зашифрованным текстом, но не обязательно должно быть приватным
$nonce = random_bytes(SODIUM_CRYPTO_AEAD_AEGIS256_NPUBBYTES);
// Дополнительные данные. Это может быть ID пользователя, e-mail или пустое значение.
$additional_data = '';
// Сообщение, которое нужно зашифровать
$message = 'Hello';
// Шифрование
$ciphertext = sodium_crypto_aead_aegis256_encrypt($message, $additional_data, $nonce, $key);
// Дешифрование
$decryptedMessage = sodium_crypto_aead_aegis256_decrypt($ciphertext, $additional_data, $nonce, $key); // "Hello"
Влияние на обратную совместимость
Алгоритмы AEGIS-128L
и AEGIS-256
добавлены в качестве новых функций и констант в расширение Sodium в PHP 8.4.
Проект sodium_compat
предоставляет пользовательский PHP-полифилл для расширения Sodium. В проекте открыт вопрос о добавлении поддержки AEGIS-128L
и AEGIS-256
, хотя никаких работ в этом направлении не ведётся.