本文已参与「新人创作礼」活动,一起开启掘金创作之路。本文已参与「新人创作礼」活动,一起开启掘金创作之路。
1.SHA256加密 不可模糊查询
1.简述
使用sha256加密解密,需要php开启openssl扩展
2.工具类方法
/**
* sha256加密
*/
public function rsaEncrypt($str)
{
$pi_key = openssl_pkey_get_private(config('sha256_private_key'));
if (!$pi_key) return "秘钥不可用"; //秘钥不可用
openssl_private_encrypt($str . "", $encrypted, $pi_key);
$encrypted = base64_encode($encrypted);
return $encrypted;
}
/**
* sha256解密
*/
public function rsaDecrypt($str)
{
$pu_key = openssl_pkey_get_public(config('sha256_public_key'));
if (!$pu_key) return false; //秘钥不可用
openssl_public_decrypt(base64_decode($str), $decrypted, $pu_key);
return $decrypted;
}
/**
* 获取公钥私钥
*/
public function rsaGetKey()
{
//创建公私钥
$res = openssl_pkey_new();
//获取私钥
openssl_pkey_export($res, $private_key);
//获取公钥
$public_key = openssl_pkey_get_details($res)['key'];
//组合rsa
$rsa = [
'public_key' => $public_key,
'private_key' => $private_key,
];
return $rsa;
}
3.操作步骤
3.1 通过 rsaGetKey()方法 获取公钥-私钥对
3.2 将获取到的公钥-私钥配置到config和.env中
config.php
//sha256加密
'sha256_private_key'=>env('SHA256_PRIVATE_KEY',"-----BEGIN PRIVATE KEY-----SHA256_PRIVATE_KEY-----BEGIN PRIVATE KEY-----"),
'sha256_public_key'=>env('SHA256_PUBLIC_KEY',"-----BEGIN PUBLIC KEY-----SHA256_PUBLIC_KEY-----BEGIN PUBLIC KEY-----"),
.env
SHA256_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC+mKboGm5i5c7P\nqIRN2p+BAryQpwuBTvsAE9NFNxHEs7hZQ7PfTwTRY1gmP0+ye7SsSRCfRlXnWPk4\ndtB0Bm4yf/NfgpXFlCmOF/84W6tQSlGdxILJYwrO8AmI5Q7Ji/yxKtSb1WEzrgXO\nd2oHiPAAvCkp6/Uy0RPoU7OL4QZoMVJHJwKEfnDl9E37RsJVTh471Ybf6DsT53Nj\nvXl3TXmdc26dlBaiZEmqoivxEanff6990NQ7FE7NTb99QqI1nmHmGjl4ScnLaQum\nXIvvuVStEtcwYHIurkJJ+Xhv546yR5N0UyK6j/lXrL5Qwie3RizfqI3WyM0jXgJQ\n11zH63SzAgMBAAECggEAOVmln2GUpZ2QxVtntCV8qU0xgDVDeP1S+Yr9n24aop2R\ncwq0LRWR1Y+XDqsuR/6BNvYlUkfPwXU8SIk34DGvJvLpQGwCtRkICAGggkzTF63F\nMTvYPtDWh74ioFaMRIki2AyTPPDP9sT+akn0VaAW16HGoR6nAUt4Ogg1lnl3fBIW\nOPBHXXHcRhff5nwufIJF2oe6q4Ufd6NmCZkEnv6lXw4maiFRrjvFCCRhwkJo6pQX\nfY3UVdZqt2XE7My0jcnBcnJOK/kXNzIm4TDEyVySNxlT5VsXcu2vgcJbfbd/4ufQ\nZmQQpynZhlgQXUZ9wONORvUB1y3Q1mNhCVVwXraQwQKBgQDjxEsJ2DqvwSF4Ibmr\n4cNpm3d0S5dJSB9jDigADRY+CCkaW0pnC1juJOohqwU8YavLx7maJvC7N0juc6RB\nscMH9Eof8VC2MjbmwKboZCpDk7iTRO6m8afee8U/fYhKO39QrpcGD8nn8vFt96i2\nJ+1allvAbsZHtZboP5cS14ZoNwKBgQDWONSymd3Z9y2GoWrAWPICdF1hxxp8e6xC\n2KjrB+1wlBoseq8aC88vBaYMeOIDmX3fHs9wc1ZamTtjOwgvxnL88NRZhgw/hmFs\nM5rEVdlGo9kIOIRs3F/GyRdIa4fny4furItQIwEMTVgL1scMT3aI1Qt3xrqncDcq\n7zTyVhThZQKBgEAX2q3YhRs0E8EEbIUrsJulPgYhx169xudO8n6hMCMglMBv9A3v\nKYVKKgBzabPGIFvlxhrU3mUwd3tyW0SJS0KPwdQfSgEbPEvO5qj6ltIRXZ1Dhoy/\n7+cxmR32q0WIXJlNp/3yr3Rv7vRs/rLTpX0aVpNeGLnRJbgRPOf2ckIdAoGBAJnc\nobBR4U0vQqyi/Uh/2fq3V2bmGXj1Xul4MgL1Y63rQc1WpLOBbeKpHPVyUWsicIyz\n1Ww/+vMBge0oth2SXH6d/vb514w82XZcrjl8K52YC0bjSQHjWostXaKvUSLERbLA\njSMWsScD2kxOjBKkdE+dLSpvOxsN9yHIQ3AXMdIdAoGBALq4Vbh3C12OEwvs5zUX\nQSvABJHtI3fDbSVrG776vml5SpL3PHSRFoSRX+kJgbVKMyCYOqkMCrHXefThSVT5\nTEnTTbeqBUwPWDxigKG6E+teBPWEPDrLgsaIisjMTNlRG/HbQH7yp4KZ7Y9kZDtj\nAZTdq8xgoZAlKGSe4YW0Srec\n-----END PRIVATE KEY-----\n"
SHA256_PUBLIC_KEY="-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvpim6BpuYuXOz6iETdqf\ngQK8kKcLgU77ABPTRTcRxLO4WUOz308E0WNYJj9Psnu0rEkQn0ZV51j5OHbQdAZu\nMn/zX4KVxZQpjhf/OFurUEpRncSCyWMKzvAJiOUOyYv8sSrUm9VhM64FzndqB4jw\nALwpKev1MtET6FOzi+EGaDFSRycChH5w5fRN+0bCVU4eO9WG3+g7E+dzY715d015\nnXNunZQWomRJqqIr8RGp33+vfdDUOxROzU2/fUKiNZ5h5ho5eEnJy2kLplyL77lU\nrRLXMGByLq5CSfl4b+eOskeTdFMiuo/5V6y+UMInt0Ys36iN1sjNI14CUNdcx+t0\nswIDAQAB\n-----END PUBLIC KEY-----\n"
3.3 创建cast/Sha256.php
<?php
namespace App\Casts;
class Sha256 implements CastsAttributes
{
/**
* 将取出的数据进行转换
*
* @param string $key
* @param mixed $value
* @param array $attributes
* @return float
*/
public function get($model, $key, $value, $attributes)
{
//获取时不解密
return $value;
//获取时解密
return rsaDecrypt($value);
}
/**
* 转换成将要进行存储的值
*
* @param string $key
* @param mixed $value
* @param array $attributes
* @return integer
*/
public function set($model, $key, $value, $attributes)
{
return rsaEncrypt($value);
}
}
3.4 model中需要转换的字段定义casts即可
protected $casts
= [
'phone' => Sha256::class,
'old_phone' => Sha256::class,
];
3.5 使用案例(按手机号查询)
public function getUserByPhone($phone){
return User::where("phone",rsaEncrypt( $phone ) )
}
2.AES加密 可模糊查询
1.简述
使用AES加密解密,支持与mysql AES交互
2.工具类方法
/**
* AES 加密
*/
public static function aesEncrypt($str)
{
return openssl_encrypt($str, 'AES-128-ECB', config('aes_key'), 0);
}
/**
* AES解密
*/
public static function aesDecrypt($str)
{
return openssl_decrypt($str, 'AES-128-ECB', config('aes_key'), 0);
}
3.操作步骤
3.1 配置一个秘钥到config和.env中
config.php
//aes加密
'aes_key'=>env('AES_KEY','AES_KEY'),
.env
AES_KEY=qwerqwdsawrwqe
3.2 创建cast/AES.php
<?php
namespace App\Casts;
use App\Service\Utils\Func;
use Hyperf\Contract\CastsAttributes;
class AES implements CastsAttributes
{
/**
* 将取出的数据进行转换
*
* @param string $key
* @param mixed $value
* @param array $attributes
* @return float
*/
public function get($model, $key, $value, $attributes)
{
// return Func::aesDecrypt($value);
return $value;
}
/**
* 转换成将要进行存储的值
*
* @param string $key
* @param mixed $value
* @param array $attributes
* @return integer
*/
public function set($model, $key, $value, $attributes)
{
return aesEncrypt($value);
}
}
3.3 model中需要转换的字段定义casts即可
//aes加密
protected $casts
= [
'phone' => AES::class,
'old_phone' => AES::class,
];
3.4 使用案例(按手机号查询模糊查询)
先base64解密 因为php AES加密会自动包一层base64加密;
public function getUserByPhone($phone){
return User::whereRaw('AES_DECRYPT(FROM_BASE64(old_phone),"'
.config('aes_key').'") LIKE "%'.$keyword.'%"')->get();
}
\