为了提高数据库中数据的保密性,基于官方方法,自己小改了一个加密解密的类。源码如下:
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);
评论区
发表新的留言
您可以留言提出您的疑问或建议。
您的留言得到回复时,会通过您填写的邮箱提醒您。