Как использовать расширение Sodium PHP в ServBay
ServBay — это мощная интегрированная среда локальной веб-разработки, в которой расширение Sodium для PHP предварительно установлено и активировано по умолчанию. Sodium — современная и простая в использовании криптографическая библиотека, широко применяемая для шифрования данных и безопасной коммуникации. Благодаря ServBay разработчикам не нужно отдельно собирать или настраивать расширение — использовать функции шифрования и дешифровки Sodium в PHP-приложениях можно сразу, что обеспечивает надежную защиту данных ваших проектов.
Общее описание расширения Sodium
Sodium (libsodium) — это современная криптографическая библиотека, созданная для предоставления удобных, простых и безопасных функций шифрования. Она поддерживает широкий спектр алгоритмов и операций: симметричное и асимметричное шифрование, цифровые подписи, вычисление хэшей, обмен ключами и другие. Начиная с PHP 7.2, Sodium интегрирована как стандартное расширение, став современной и более защищённой заменой устаревшей библиотеки mcrypt.
Ключевые особенности
- Удобство использования: лаконичный API облегчает реализацию шифрования и дешифровки для разработчиков.
- Высокая безопасность: современные алгоритмы и лучшие практики для надежной защиты информации.
- Многофункциональность: поддержка симметричного/асимметричного шифрования, цифровых подписей, хэшей, обмена ключами и др.
- Кроссплатформенность: доступна для различных операционных систем и языков программирования.
- Высокая производительность: операции шифрования и дешифровки выполняются быстро — решение отлично подходит для задач с требованиями к скорости.
Sodium как замена mcrypt
Библиотека mcrypt долгое время использовалась для шифрования в PHP, но была заброшена и не обновлялась, что сопровождалось потенциальными угрозами безопасности. В PHP 7.1 она официально устарела, а в 7.2 — удалена. Sodium пришла на смену как современное, безопасное и производительное решение. Для новых проектов настоятельно рекомендуется заменить mcrypt на Sodium для всех операций шифрования и дешифровки.
Доступность и включение Sodium в ServBay
В ServBay расширение Sodium предустановлено и включено по умолчанию для PHP 7.2 и новее. Это означает, что пользователям ничего не нужно устанавливать или настраивать вручную. Достаточно запустить ServBay и выбрать соответствующую версию PHP — можно сразу использовать функции Sodium в своем коде.
Для проверки активации Sodium откройте функцию phpinfo() в ServBay. В интерфейсе выберите используемую версию PHP, перейдите к опции phpinfo()
, и на открывшейся странице найдите раздел 'sodium' — вы увидите сведения о включённом модуле.
Использование расширения Sodium в PHP-коде
Убедившись, что расширение Sodium активно, вы можете использовать его функции в своих PHP-проектах. Сохраняйте PHP-файлы в соответствующих подкаталогах корневой директории сайтов ServBay (по умолчанию /Applications/ServBay/www
), и запускайте их через браузер. Вот примеры базовых сценариев:
Пример кода (симметричное шифрование)
Симметричное шифрование использует один и тот же ключ для шифрования и дешифрования.
<?php
// Сообщение для шифрования
$message = "This is a secret message from servbay.demo";
// Генерация случайного ключа (фиксированная длина SODIUM_CRYPTO_SECRETBOX_KEYBYTES)
$key = sodium_crypto_secretbox_keygen();
// Генерация случайного Nonce (однократно используемый номер), важно использовать одинаковый nonce при шифровании и дешифровании
$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
// Шифрование с помощью ключа и nonce
$ciphertext = sodium_crypto_secretbox($message, $nonce, $key);
echo "Оригинальное сообщение: " . $message . "\n";
echo "Nonce (Base64): " . base64_encode($nonce) . "\n"; // Nonce обычно хранится или передается вместе с шифртекстом
echo "Шифртекст (Base64): " . base64_encode($ciphertext) . "\n\n";
// --- Процесс дешифровки ---
// Предполагается, что у нас есть шифртекст, nonce и ключ
$retrieved_ciphertext = $ciphertext; // Получено из хранения или передачи
$retrieved_nonce = $nonce; // Получено из хранения или передачи
$retrieved_key = $key; // Получено из хранения или передачи
// Дешифрование с помощью ключа и nonce
$decrypted = sodium_crypto_secretbox_open($retrieved_ciphertext, $retrieved_nonce, $retrieved_key);
// Проверка успешности дешифровки
if ($decrypted === false) {
echo "Ошибка дешифрования!\n";
} else {
echo "Дешифрованное сообщение: " . $decrypted . "\n";
}
// Очистка чувствительных данных для предотвращения утечек из памяти
sodium_memzero($key);
sodium_memzero($retrieved_key);
if ($decrypted !== false) {
sodium_memzero($decrypted);
}
?>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Пример кода (асимметричное шифрование)
Асимметричное шифрование использует пару ключей: открытый (публичный) и закрытый (секретный). Публичный ключ используется для шифрования, закрытый — для дешифровки.
<?php
// Сообщение для шифрования
$message = "This is another secret message for servbay-demo user";
// Генерация пары ключей (публичный для шифрования, секретный для дешифровки)
$keypair = sodium_crypto_box_keypair();
$publicKey = sodium_crypto_box_publickey($keypair); // Передается другому пользователю
$secretKey = sodium_crypto_box_secretkey($keypair); // Держится в секрете, не раскрывается
echo "Публичный ключ (Base64): " . base64_encode($publicKey) . "\n";
echo "Секретный ключ (Base64): [секретный ключ является конфиденциальным и не должен выводиться или распространяться]\n\n";
// --- Процесс шифрования (с использованием публичного ключа получателя) ---
// Предполагается, что отправитель обладает $publicKey получателя
// Генерируем случайный nonce, обязательно должен быть общий при шифровании и дешифровании
$nonce = random_bytes(SODIUM_CRYPTO_BOX_NONCEBYTES);
// Используем публичный ключ получателя и секретный ключ отправителя (обычно требуется согласование ключей, здесь для примера все ключи принадлежат одному пользователю)
// Важно: в реальных сценариях здесь используются секретный ключ отправителя и публичный ключ получателя
// В crypto_box Sodium на базе Curve25519 реализован обмен ключами по Диффи-Хеллману, необходимы пары ключей обеих сторон
// Для упрощения примера мы шифруем и дешифруем в рамках одной пары
$ciphertext = sodium_crypto_box($message, $nonce, $keypair); // В этом примере keypair содержит оба ключа
echo "Оригинальное сообщение: " . $message . "\n";
echo "Nonce (Base64): " . base64_encode($nonce) . "\n"; // Nonce хранится или передается вместе с шифртекстом
echo "Шифртекст (Base64): " . base64_encode($ciphertext) . "\n\n";
// --- Процесс дешифровки (с использованием секретного ключа получателя) ---
// Получатель должен иметь шифртекст, nonce, свой секретный ключ ($secretKey) и публичный ключ отправителя ($publicKey)
// Здесь для простоты используется $keypair
$retrieved_ciphertext = $ciphertext;
$retrieved_nonce = $nonce;
$retrieved_keypair = $keypair; // Для дешифровки используем keypair
// Дешифруем при помощи своей пары ключей
$decrypted = sodium_crypto_box_open($retrieved_ciphertext, $retrieved_nonce, $retrieved_keypair);
// Проверяем результат
if ($decrypted === false) {
echo "Ошибка дешифрования!\n";
} else {
echo "Дешифрованное сообщение: " . $decrypted . "\n";
}
// Очистка скрытых данных
sodium_memzero($secretKey); // Стираем секретный ключ
sodium_memzero($keypair); // Стираем пару ключей
if ($decrypted !== false) {
sodium_memzero($decrypted);
}
?>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
Пример кода (цифровая подпись)
Цифровая подпись служит подтверждением целостности сообщения и установления отправителя. Подпись создается с помощью секретного ключа, а проверяется с помощью публичного.
<?php
// Сообщение для подписи
$message = "This message needs to be signed by servbay.demo";
// Генерация пары ключей для подписи (секретный — для подписи, публичный — для проверки)
$keypair = sodium_crypto_sign_keypair();
$publicKey = sodium_crypto_sign_publickey($keypair); // Передается проверяющей стороне
$secretKey = sodium_crypto_sign_secretkey($keypair); // Хранится в секрете, никогда не раскрывается
echo "Публичный ключ (Base64): " . base64_encode($publicKey) . "\n";
echo "Секретный ключ (Base64): [секретный ключ является конфиденциальным и не должен выводиться или распространяться]\n\n";
// --- Подписание (используется секретный ключ отправителя) ---
$signature = sodium_crypto_sign_detached($message, $secretKey);
echo "Оригинальное сообщение: " . $message . "\n";
echo "Подпись (Base64): " . base64_encode($signature) . "\n\n";
// --- Проверка подписи (используется публичный ключ отправителя) ---
// Предполагается, что проверяющая сторона имеет сообщение, подпись и публичный ключ ($publicKey) отправителя
$retrieved_message = $message;
$retrieved_signature = $signature;
$retrieved_publicKey = $publicKey;
// Валидация подписи по публичному ключу
if (sodium_crypto_sign_verify_detached($retrieved_signature, $retrieved_message, $retrieved_publicKey)) {
echo "Подпись действительна! Сообщение не изменено и действительно отправлено держателем секретного ключа.\n";
} else {
echo "Подпись недействительна! Сообщение могло быть изменено или подпись не соответствует секретному ключу.\n";
}
// Очистка скрытых данных
sodium_memzero($secretKey); // Стираем секретный ключ
sodium_memzero($keypair); // Стираем пару ключей
?>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Заключение
С помощью ServBay разработчики могут легко воспользоваться предустановленным и по умолчанию активированным расширением Sodium PHP. Это устраняет сложности с ручной установкой и настройкой компонента в локальной среде, позволяя сконцентрироваться на полноценном использовании возможностей мощного криптографического инструментария для повышения безопасности приложений. Sodium как современная альтернатива mcrypt — ключевой инструмент для построения надежных и безопасных веб-приложений. ServBay значительно упрощает этот процесс, помогая разработчикам создавать эффективную и безопасную локальную среду для разработки.