В настоящее время у меня есть приложение PHP, которое использует шифрование данных в состоянии покоя для хранения конфиденциальной информации в базе данных, которую позже я могу расшифровать для использования в моем приложении.
Вот текущий код, который я использую. Я знаю … я знаю … это совсем не безопасно, но отлично работает для того, для чего я его использую. Я не храню номера кредитных карт, номера социального страхования или что-то в этом роде. В основном только имена и адреса.
define('CRYPTO_KEY', 'some-key');
function decrypt($val){
$val = urlencode($val);
$data = base64_decode(urldecode($val));
$iv = substr($data, 0, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC));
$val = rtrim(
mcrypt_decrypt(
MCRYPT_RIJNDAEL_128,
hash('sha256', CRYPTO_KEY, true),
substr($data, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC)),
MCRYPT_MODE_CBC,
$iv
),
"\0");
return $val;
}
function enc($val){
$iv = mcrypt_create_iv(
mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC),
MCRYPT_DEV_URANDOM
);
$val = urlencode(base64_encode(
$iv .
mcrypt_encrypt(
MCRYPT_RIJNDAEL_128,
hash('sha256', CRYPTO_KEY, true),
$selection,
MCRYPT_MODE_CBC,
$iv
)
));
return $val;
}
Проблема, с которой я сталкиваюсь, заключается в том, что я только что обновился с PHP 5.5 до PHP 7.1. Теперь в PHP 7.1 моя функция encrypt / decrypt выдает массу предупреждений о том, что следующая функция устарела:
Я провел некоторое исследование и обнаружил, что новые рекомендации должны использовать библиотеки, такие как libsodium или OpenSSL. ВОТ
Я посмотрел оба, но документация слишком техническая для меня, чтобы понять. Я даже не могу понять, как установить libsodium, не говоря уже о его использовании.
У меня вопрос: есть ли у кого-нибудь приличная функция шифрования / дешифрования, совместимая с PHP 7.1 или выше, которой они хотели бы поделиться?
А еще лучше, кто-нибудь захочет предоставить инструкции о том, как использовать libsodium или OpenSSL для шифрования / дешифрования данных?
К вашему сведению — в настоящее время я использую платформу общего хостинга с cPanle. Я установил composer и понимаю, как устанавливать пакеты через него. Я никогда не использовал PECL или PEAR
Это старый вопрос, но я решил, что все равно отвечу.
Начиная с PHP 7.2, Libsodium включен как основной модуль. Вам больше ничего не нужно устанавливать, он будет «просто работать», двигаясь вперед.
Для PHP 7.1 я бы порекомендовал расширение Pecl для Libsodium. Вы можете установить его так же, как и любое другое расширение Pecl:
pecl install libsodium
В любом случае, я очень рекомендую использовать sodium_compat
библиотека как обертка вокруг Libsodium. Он совместим с PHP вплоть до 5.2 и даже поставляется с PHP-нативной реализацией Libsodium, если модуль Pecl отсутствует.
Замечания: Нативная реализация PHP значительно медленнее, чем скомпилированное расширение, но если у вас возникли проблемы с обновлением до 7.2 или установкой модуля Pecl, это как минимум поможет вам начать работу.
Что касается существующего кода, рассмотрите следующее как обновление для использования sodium_compat
:
define('CRYPTO_KEY', 'some-key');
function decrypt($val){
$key = base64_decode(CRYPTO_KEY);
$data = base64_decode(urldecode($val));
$nonce = substr($data, 0, ParagonIE_Sodium_Compat::CRYPTO_SECRETBOX_NONCEBYTES);
$ciphertext = substr($data, ParagonIE_Sodium_Compat::CRYPTO_SECRETBOX_NONCEBYTES);
$plaintext = ParagonIE_Sodium_Compat::crypto_secretbox_open($ciphertext, $nonce, $key);
if ($plaintext === false) {
throw new Exception("Bad ciphertext");
}
return $plaintext;
}
function enc($val){
$key = base64_decode(CRYPTO_KEY);
$nonce = random_bytes(ParagonIE_Sodium_Compat::CRYPTO_SECRETBOX_NONCEBYTES);
$ciphertext = ParagonIE_Sodium_Compat::crypto_secretbox($val, $nonce, $key);
return urlencode(base64_encode($nonce . $ciphertext));
}
Дополнительный ParagonIE_Sodium_Compat::
пространство имен, если вы используете sodium_compat
, Если вы можете просто перейти на PHP 7.2, вы можете сбросить его и использовать нативные методы и константы непосредственно. Все они названы одинаково, поэтому я не буду здесь их описывать.
Замечания: Как упоминалось другими в комментариях, хранение вашего секретного ключа в жестком коде вместе с кодом, который выполняет шифрование, не является хорошей идеей. Я скопировал его здесь, чтобы проиллюстрировать, как ваш код изменится, чтобы использовать Libsodium, а не как подтверждение
CRYPTO_KEY
определено.
Вот способ зашифровать Php 7 с помощью Open SSL. Это верный способ зашифровать и расшифровать ваши данные. Единственное, что нужно иметь в виду, это то, что при поиске в вашей базе данных определенных параметров вам нужно будет расшифровать данные до начала поиска. Сначала вы начинаете с ключа. Тогда есть функция шифрования, а также функция дешифрования.
Ключ вы можете изменить на что угодно. Храните его на своем сервере или другом сервере.
$key = 'qkwjdiw239&&jdafweihbrhnan&^%$ggdnawhd4njshjwuuO';
Далее идет функция шифрования PHP.
function encryptthis($data, $key) {
$encryption_key = base64_decode($key);
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));
$encrypted = openssl_encrypt($data, 'aes-256-cbc', $encryption_key, 0,
$iv);
return base64_encode($encrypted . '::' . $iv);
}
Затем для расшифровки используйте эту функцию.
function decryptthis($data, $key) {
$encryption_key = base64_decode($key);
list($encrypted_data, $iv) = array_pad(explode('::', base64_decode($data),
2),2,null);
return openssl_decrypt($encrypted_data, 'aes-256-cbc', $encryption_key, 0,
$iv);
}
Чтобы увидеть код для рабочего примера с формой, пожалуйста, посетите эту веб-страницу. https://a1websitepro.com/data-encryption-php-mysql-methods-implementation-open-ssl-encrypt/