<?php declare(strict_types=1); namespace App\Utils\Traits; trait UniversalEncryption { private string $key; public function getKey(): string { $key = openssl_digest(env('UNIVERSAL_ENCRYPTION_AES_KEY'), 'sha256', true); return hash_pbkdf2('sha256', $key, '', 1, 32, true); } /** * Encrypt * @param string $data * @return string */ public function encrypt(string $data): string { $ivSize = openssl_cipher_iv_length('aes-256-cbc'); // AES-256-CBC需要的IV长度 $iv = openssl_random_pseudo_bytes($ivSize); // 生成随机的IV $encrypted = openssl_encrypt($data, 'aes-256-cbc', $this->getKey(), OPENSSL_RAW_DATA, $iv); $encryptedWithIv = $iv . $encrypted; return base64_encode($encryptedWithIv); } /** * Decrypt * @param string $encryptedData * @return bool|string */ public function decrypt(string $encryptedData): bool|string { $encodedData = base64_decode($encryptedData); $ivSize = openssl_cipher_iv_length('aes-256-cbc'); $iv = mb_substr($encodedData, 0, $ivSize, '8bit'); $encryptedData = mb_substr($encodedData, $ivSize, null, '8bit'); return openssl_decrypt($encryptedData, 'aes-256-cbc', $this->getKey(), OPENSSL_RAW_DATA, $iv); } }