Защита конфиденциальных данных с помощью шифрования и расшифровки
➖ Задача: Безопасно зашифровать данные, чтобы защитить их от несанкционированного доступа, и расшифровать их при необходимости.
➖ Решение:
Используйте расширение Sodium для симметричного шифрования данных.
1️⃣ Генерация ключа шифрования
Сначала нужно создать секретный ключ для шифрования:
2️⃣ Шифрование данных
3️⃣ Расшифровка данных
🔹 Ключ: Генерируется однократно и должен храниться безопасно (например, за пределами кода, в конфигурационных файлах или хранилище секретов).
🔹 Nonce (вектор инициализации): Должен быть уникальным для каждого сообщения, но его можно передавать в открытом виде вместе с шифротекстом.
🔹 Алгоритм: Sodium использует AES-256-GCM или подобные современные алгоритмы для безопасного шифрования.
➖ Когда использовать:
🔹 Защита конфиденциальной информации (паролей, токенов, личных данных).
🔹 Шифрование конфигурационных файлов.
🔹 Безопасное хранение данных в базе данных.
Никогда не храните ключи шифрования вместе с данными. Используйте безопасные хранилища, такие как HashiCorp Vault или AWS Secrets Manager.
👉 @PHPgx | #заметки
Используйте расширение Sodium для симметричного шифрования данных.
Сначала нужно создать секретный ключ для шифрования:
$key = sodium_crypto_secretbox_keygen(); // Генерация ключа
file_put_contents('secret.key', $key); // Сохранение ключа в файл
$message = "Конфиденциальные данные";
$key = file_get_contents('secret.key'); // Получение ключа из файла
$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES); // Генерация случайного вектора инициализации
$ciphertext = sodium_crypto_secretbox($message, $nonce, $key);
// Сохранение зашифрованных данных
file_put_contents('data.enc', $nonce . $ciphertext);
echo "Данные успешно зашифрованы!";
$key = file_get_contents('secret.key');
$encrypted = file_get_contents('data.enc');
$nonce = mb_substr($encrypted, 0, SODIUM_CRYPTO_SECRETBOX_NONCEBYTES, '8bit');
$ciphertext = mb_substr($encrypted, SODIUM_CRYPTO_SECRETBOX_NONCEBYTES, null, '8bit');
$decrypted = sodium_crypto_secretbox_open($ciphertext, $nonce, $key);
if ($decrypted === false) {
throw new Exception("Ошибка расшифровки данных!");
}
echo "Расшифрованные данные: {$decrypted}";
Никогда не храните ключи шифрования вместе с данными. Используйте безопасные хранилища, такие как HashiCorp Vault или AWS Secrets Manager.