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

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

Я провел небольшое исследование и обнаружил, что новые рекомендации заключаются в использовании таких библиотек, как libsodium или OpenSSL, найденных ЗДЕСЬ

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

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

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

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


person Austin    schedule 19.10.2017    source источник
comment
Примечание: php.net/manual/en/function.mcrypt-encrypt.php и php.net/manual/en/function.mcrypt-decrypt. php сообщает Предупреждение Эта функция УСТАРЕЛА, начиная с PHP 7.1.0. Крайне не рекомендуется полагаться на эту функцию.   -  person Funk Forty Niner    schedule 19.10.2017
comment
@fred Я знаю, поэтому я обращаюсь к сообществу за лучшим способом   -  person Austin    schedule 19.10.2017
comment
нашел несколько stackoverflow.com/ вопросы/37250852/ --- stackoverflow.com/questions/41272257/ --- stackoverflow.com/questions/9993909/replace-mcrypt-with-openssl, если это поможет, и stackoverflow.com/questions/41740600/php7-1-mcrypt-alternative может быть здесь обманом.   -  person Funk Forty Niner    schedule 19.10.2017
comment
Что вы на самом деле пытаетесь предотвратить, делая это? Если вы храните ключ шифрования/дешифрования непосредственно в исходном коде PHP, любой, у кого есть доступ к вашему коду, может легко расшифровать все, что захочет.   -  person Mike    schedule 19.10.2017


Ответы (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.

person EAMann    schedule 20.03.2018

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

person user2970934    schedule 12.12.2018