当前位置: 首页 > 知识库问答 >
问题:

PHP 7.1及更高版本的数据加密/解密

冯枫
2023-03-14

我目前有一个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中,我的加密/解密函数抛出大量警告,指出以下函数已弃用:

    < li>mcrypt_get_iv_size() < li>mcrypt_create_iv() < li>mcrypt_encrypt() < li>mcrypt_decrypt()

我做了一些研究,发现新的建议是使用libNa或OpenSSL等库,这里有。

我研究了这两个问题,但文档太过技术性,我无法理解。我甚至不知道如何安装libsodium,更不用说使用它了。

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

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

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

共有2个答案

訾晋
2023-03-14

这是一种使用开放 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/

松英叡
2023-03-14

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

从 PHP 7.2 开始,库钠已作为核心模块启用。您无需安装任何其他内容,它将“正常工作”。

对于PHP 7.1,我建议使用LibNa的Pecl扩展。您可以像安装任何其他Pecl扩展一样安装它:

pecl安装libnadium

无论如何,我强烈建议使用sodium_compat库作为LibNa的包装器。从5.2开始,它就与PHP兼容,如果缺少Pecl模块,它甚至还附带了一个PHP原生的LibNa实现。

注意: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));
}

额外的< code > ParagonIE _ Sodium _ Compat::命名空间是在您使用< code>sodium_compat的情况下。如果你能升级到PHP 7.2,你可以直接使用本地方法和常量。它们的名字都很相似,所以我不会在这里赘述。

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

 类似资料:
  • 问题内容: 按照此答案中的建议,我的应用程序当前使用构造函数将数据传递到表单类型。但是,Symfony2.8升级指南建议不要将类型实例传递给函数: 将类型实例传递给Form :: add(),FormBuilder :: add()和FormFactory :: create *()方法已过时,在Symfony 3.0中不再受支持。而是传递类型的标准类名。 看来我无法使用完全合格的类名传递数据,还

  • 前面小节介绍了如何存储密码,但是有的时候,我们想把一些敏感数据加密后存储起来,在将来的某个时候,随需将它们解密出来,此时我们应该在选用对称加密算法来满足我们的需求。 base64加解密 如果Web应用足够简单,数据的安全性没有那么严格的要求,那么可以采用一种比较简单的加解密方法是base64,这种方式实现起来比较简单,Go语言的base64包已经很好的支持了这个,请看下面的例子: package

  • 问题内容: 网页中Java Applets的一个众所周知的问题是,浏览器会忽略applet标记的z-index而不是页面中的其他组件。无论您如何在页面中定位元素和z- index元素,小程序都将在所有内容之上吸引自己。 有一种解决方法,称为iframe垫片,如此处所述:http : //www.oratransplant.nl/2007/10/26/using-iframe-shim-to-par

  • 问题内容: 我们正在使用bcrypt来存储不需要解密的密码和数据。 应该采取什么措施来保护其他这样做的用户信息。对于此示例,假设我们不希望用户的真实姓名采用纯文本格式,以防有人获取数据库。 这是一些敏感数据,但还需要不时调用并以纯文本显示。有没有简单的方法可以做到这一点? 问题答案: 您可以使用crypto模块: 编辑 现在 createCipher 和 createDecipher 已被弃用,而

  • 本文向大家介绍PHP对称加密函数实现数据的加密解密,包括了PHP对称加密函数实现数据的加密解密的使用技巧和注意事项,需要的朋友参考一下 项目中有一个地方用到了将用户ID加密、传至下个接点进行反解的需求。(原谅我不能透漏太多-_-!),第一个想到的就是康盛Ucenter中的一个函数,后来搜了下,在简明魔法中也找到了个简单的方法,遂整合了下,形成了自己使用的函数。 一、对称加密 发送方将明文使用密钥和

  • 我目前正在为培训应用程序实现AudioHelper,该应用程序可以在培训期间运行一些激励性演讲。因此,基本上,如果一个演讲正在运行,我想避开我的spotify音频,以便清楚地听到演讲。对于Kitkat和Oreo(及更高版本),我已经解决了这个问题(参见代码)。但对于Lollipop,我找不到正确的实现。在 developer.android.com,他们写道: 对于以Android 5.0(API