шифрование / дешифрование данных для PHP 7.1 и выше

В настоящее время у меня есть приложение 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 выдает массу предупреждений о том, что следующая функция устарела:

  • mcrypt_get_iv_size ()
  • mcrypt_create_iv ()
  • mcrypt_encrypt ()
  • mcrypt_decrypt ()

Я провел некоторое исследование и обнаружил, что новые рекомендации должны использовать библиотеки, такие как libsodium или OpenSSL. ВОТ

Я посмотрел оба, но документация слишком техническая для меня, чтобы понять. Я даже не могу понять, как установить libsodium, не говоря уже о его использовании.

У меня вопрос: есть ли у кого-нибудь приличная функция шифрования / дешифрования, совместимая с PHP 7.1 или выше, которой они хотели бы поделиться?

А еще лучше, кто-нибудь захочет предоставить инструкции о том, как использовать libsodium или OpenSSL для шифрования / дешифрования данных?

К вашему сведению — в настоящее время я использую платформу общего хостинга с cPanle. Я установил composer и понимаю, как устанавливать пакеты через него. Я никогда не использовал PECL или PEAR

2

Решение

Это старый вопрос, но я решил, что все равно отвечу.

Начиная с 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 определено.

1

Другие решения

Вот способ зашифровать 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/

0

По вопросам рекламы [email protected]