为了提高数据库中数据的保密性,基于官方方法,自己小改了一个加密解密的类。源码如下:

class opeEncrypDecrypt
{
    private static function key()
    {
        return file_get_contents('my.key'); // 密钥,自己随便生成一个32随机字符串。保存在key文件里。或者直接return密钥字符串也行。或者其它方法返回密钥字符串就可以。
    }

    public static function encrypt($plaintext, $cipher = "aes-256-gcm")
    {
        $key = self::key();
        if (!in_array($cipher, openssl_get_cipher_methods())) {
            return false;
        }
        $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length($cipher));
        $tag = "TLK_[]/895"; //自行设定
        $encrypted = openssl_encrypt(
            gzcompress($plaintext),
            $cipher,
            base64_decode($key),
            $options = OPENSSL_RAW_DATA,
            $iv,
            $tag,
        );
        return json_encode(
            array(
                "a" => base64_encode($tag),
                "b" => base64_encode($encrypted),
                "c" => base64_encode($iv),
            )
        );
    }

    public static function decrypt($jsonData, $cipher = "aes-256-gcm")
    {
        $key = self::key();
        try {
            $json = json_decode($jsonData, true, 2, JSON_THROW_ON_ERROR);
        } catch (Exception $e) {
            return false;
        }
        return gzuncompress(
            openssl_decrypt(
                base64_decode($json['b']),
                $cipher,
                base64_decode($key),
                $options = OPENSSL_RAW_DATA,
                base64_decode($json['c']),
                base64_decode($json['a'])
            )
        );
    }
}
说明:

使用上面的加密解密方法需要注意一点。需要准备密钥,且一定要保存好。密钥文件(或密钥字符串)一旦丢失,加密数据永远无法重建天日。如果使用key文件,为了key文件不被直接访问到,建议key文件所在文件夹下添加.htaccess文件。添加禁止直接访问key文件的代码:

<IfModule mod_headers.c>
    <FilesMatch "\.(key)$">
        require all denied
    </FilesMatch>
</IfModule>

用法:

加密数据,返回加密数据:
//假设要加密的明文为:世界和平
$encrypted = opeEncrypDecrypt::encrypt("世界和平!");
解密,输出明文:
//$encrypted为加密数据。
$plaintext = opeEncrypDecrypt::decrypt($encrypted);