Как правило, писать собственную криптографию - плохая идея, если у вас нет опыта взлома криптографических реализаций других людей.
Ни один из приведенных здесь примеров не проверяет подлинность зашифрованного текста , что делает его уязвимым для атак переписывания битов.
Если вы можете установить расширения PECL, libsodium еще лучше
<?php
// PECL libsodium 0.2.1 and newer
/**
* Encrypt a message
*
* @param string $message - message to encrypt
* @param string $key - encryption key
* @return string
*/
function safeEncrypt($message, $key)
{
$nonce = \Sodium\randombytes_buf(
\Sodium\CRYPTO_SECRETBOX_NONCEBYTES
);
return base64_encode(
$nonce.
\Sodium\crypto_secretbox(
$message,
$nonce,
$key
)
);
}
/**
* Decrypt a message
*
* @param string $encrypted - message encrypted with safeEncrypt()
* @param string $key - encryption key
* @return string
*/
function safeDecrypt($encrypted, $key)
{
$decoded = base64_decode($encrypted);
$nonce = mb_substr($decoded, 0, \Sodium\CRYPTO_SECRETBOX_NONCEBYTES, '8bit');
$ciphertext = mb_substr($decoded, \Sodium\CRYPTO_SECRETBOX_NONCEBYTES, null, '8bit');
return \Sodium\crypto_secretbox_open(
$ciphertext,
$nonce,
$key
);
}
Затем, чтобы проверить это:
<?php
// This refers to the previous code block.
require "safeCrypto.php";
// Do this once then store it somehow:
$key = \Sodium\randombytes_buf(\Sodium\CRYPTO_SECRETBOX_KEYBYTES);
$message = 'We are all living in a yellow submarine';
$ciphertext = safeEncrypt($message, $key);
$plaintext = safeDecrypt($ciphertext, $key);
var_dump($ciphertext);
var_dump($plaintext);
Это может использоваться в любой ситуации, когда вы передаете данные клиенту (например, зашифрованные куки-файлы для сеансов без серверного хранилища, зашифрованные параметры URL и т. Д.) С достаточно высокой степенью уверенности, что конечный пользователь не сможет расшифровать или надежно подделать его.
Поскольку libsodium является кроссплатформенным , это также упрощает связь с PHP, например, с. Java-апплеты или собственные мобильные приложения.
Примечание. Если вам необходимо добавить зашифрованные файлы cookie на базе libsodium в ваше приложение, мой работодатель Paragon Initiative Enterprises разрабатывает библиотеку под названием Halite , которая сделает все это за вас. .