【问题标题】:data encryption/decryption for PHP 7.1 and higherPHP 7.1 及更高版本的数据加密/解密
【发布时间】:2018-03-31 22:21:28
【问题描述】:

我目前有一个 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 等库,发现 HERE

我查看了这两个文档,但文档技术性太强,我无法理解。我什至不知道如何安装 libsodium,更不用说使用它了。

我的问题是,是否有人愿意分享与 PHP 7.1 或更高版本兼容的不错的加密/解密功能?

更好的是,有人愿意提供有关如何使用 libsodium 或 OpenSSL 进行数据加密/解密的说明吗?

仅供参考 - 我目前正在使用带有 cPanle 的共享托管平台。我已经安装了作曲家并了解如何通过它安装软件包。我从未使用过 PECL 或 PEAR

【问题讨论】:

标签: php encryption openssl cryptography libsodium


【解决方案1】:

这是一个有点老的问题,但我想我还是会回答的。

从 PHP 7.2 开始,Libsodium 作为核心模块启用。您无需安装其他任何东西,它会继续“正常工作”。

对于 PHP 7.1,我建议将 the Pecl extension 用于 Libsodium。您可以像安装任何其他 Pecl 扩展程序一样安装它:

pecl install libsodium

无论如何,我强烈建议使用 sodium_compat 库作为 Libsodium 的包装器。它与 PHP 一直兼容到 5.2,如果 Pecl 模块丢失,它甚至还附带了一个 PHP 原生的 Libsodium 实现。

注意: PHP-native 实现比编译后的扩展慢得多,但如果您在升级到 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,则可以转储它并直接使用本机方法和常量。它们的名称都非常相似,所以我不会在这里赘述。

注意:正如 cmets 中的其他人所提到的,将硬编码的密钥与执行加密的代码一起存储并不是一个好主意。我在这里复制它是为了说明您的代码将如何更改以使用 Libsodium,而不是作为对 CRYPTO_KEY 定义方式的认可。

【讨论】:

    【解决方案2】:

    这是一种使用 Open SSL 加密 Php 7 的方法。这是加密和解密数据的可靠方法。唯一要记住的是,在您的数据库中搜索某些参数时,您需要在搜索开始之前解密。首先,您从一把钥匙开始。然后是加密功能和解密功能。

    您可以更改为任何您想要的键。将其存储在您的服务器或其他服务器上。

        $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/

    【讨论】:

      猜你喜欢
      • 2022-11-08
      • 2023-03-04
      • 2011-07-08
      • 2018-04-11
      • 2011-11-20
      • 1970-01-01
      • 2012-08-31
      • 2018-11-13
      • 1970-01-01
      相关资源
      最近更新 更多