AES BASE64 优化算法数据加密,前面应用纯JavaS

lxf2023-03-11 07:30:01

前几日做微信小程序开发,针对静态页面项目,假如涉及的隐秘数据较多,大家一般采用前端后端开展插口数据加密解决,使用的是 AES BASE64 优化算法数据加密,前面应用纯JavaScript的加密技术标准库crypto-js开展数据库加密,后面应用PHP openssl_decrypt()破译开展网络信息安全传送~

高端数据加密规范(AES,Advanced Encryption Standard)为比较常见的对称加密算法(小程序数据加密就是通过这一加密技术的)。对称加密算法其实就是加密和解密用同样的密匙,具体数据加密步骤如下图所示:

AES BASE64 优化算法数据加密,前面应用纯JavaS

crypto-js(GitHub)是谷歌开发的一个纯JavaScript的加密技术标准库,能够十分方便在前面开展之而鼓励的加解密实际操作。现阶段crypto-js已适用的算法有:MD5,SHA-1,SHA-256,AES,Rabbit,MARC4,HMAC,HMAC-MD5,HMAC-SHA1,HMAC-SHA256,PBKDF2。常见的加密算法有MD5和AES。

crypto-js 安装方法

  npm install crypto-js

安装好了之后立即找到crypto-js.js文档,并把它引进 const CryptoJS = require('./crypto-js.js');

uniapp app开发 静态页面 api接口安全设置

1. 要求服务器端获得任意token, create_time共存到文件缓存中

2. 前面取得token,create_time应用CryptoJS数据加密形成签字,放进请求头中

3. 服务器端技术工程师破译,进行sign及时性校检 成功后获得接口数据

    const CryptoJS = require('./crypto-js.js'); //引入AES源代码js
    const BASE_URL = "http://love.ouyangke.net/"
    const key = CryptoJS.enc.Utf8.parse("chloefuckityoall"); //十六位十六进制数做为密匙
    const iv = CryptoJS.enc.Utf8.parse('9311019310287172'); //十六位十六进制数做为非空的复位空间向量
    export const getAccessToken = ()=> { 
uni.request({
url: BASE_URL   'getAccessToken',
method: 'GET',
success:   (res) => {
// console.log(res);
const {
data
} = res 
if (data.code == 0) {
return
}
// console.log(data.token);
var encrypted = CryptoJS.AES.encrypt(JSON.stringify({
token: data.token,
create_time: data.create_time
}), key, {
mode: CryptoJS.mode.CBC, 
padding: CryptoJS.pad.Pkcs7,
iv: iv
}).toString()
// console.log('签字进行',encrypted );
// 纪录在本地
  uni.setStorage({
key:"sign",
data:encrypted
});

},
fail: (err) => {
console.log(JSON.stringify(err));
}
 })
    }

然后将封装形式的getAccessToken函数申请注册到vue原形上

AES BASE64 优化算法数据加密,前面应用纯JavaS

之后在需要使用的办法上直接启用此方法就行了,如下图:

AES BASE64 优化算法数据加密,前面应用纯JavaS

后面tp6建立正中间控制板Common.php,让每一个除开形成token的控制板集成化这一正中间控制板,实时监测签字实效性

common.php代码如下所示:

 <?php
    namespace app\love\controller;
    use app\BaseController;
    use think\facade\Cache;
    use lib\ApiAuth;
    class Common extends BaseController
    {
        const ILLEGAL_SIGN = 'sign is illegal';
        public function initialize()
        {
              $this->checkRequestAuth();    
        }
        //检验方法
         /**
     * 检测sign信息真实性 
     * @return bool  校检根据回到true,不成功回到false
     * 
         * 查验app每一次递交的信息是否有效
         */
        public function checkRequestAuth()
        { 
            //获得header头某个信息内容sign
            $sign = request()->header('sign');
            $res = ApiAuth::checkSign($sign);
            if(!$res)
            {
                echo json_encode(['status'=>0,'msg'=>self::ILLEGAL_SIGN]);
                exit;
            }
        }
    }

ApiAuth.php

<?php
namespace lib;
use think\facade\Cache;
//校检类


class ApiAuth
{
    // 形成签字
    public static function setSign(Array $data=[])
    {
        ksort($data);
        $sign_str = http_build_query($data);
        return (new Aes())->encrypt($sign_str);
    }
    // 校检sign
    public static function checkSign($sign)
    {
    //   破译sign 获得过的密文信息内容 
        $str = (new Aes())->decrypt($sign);
        if(!$str)
        {
            return false;
        }
        $arr = json_decode($str,true);
        $res =  Cache::get($arr['token']);
        if(!is_array($arr) || count($arr)!=2 || !$res)
        {
            return false;
        }
        if($res)
        {
            if($arr['create_time'] != $res)
            {
                return false;
            }else{
                //校检sign有效期限 
                $cliff = time()-$arr['create_time'];                if ( $cliff > config('app.aes.api_sign_expire_time')) {
                    return false;  
                }
                //验证成功,删掉token
                Cache::delete($arr['token']);
                return true;
            }
        }         
    }
}

Aes.php:

<?php
namespace lib;
class Aes{
    private $key = null;
    private $iv = null;
    public function __construct(){
        $this->iv = config('app.aes.aesiv');//这儿是以环境变量中取和前面一致的iv与key
        $this->key = config('app.aes.aeskey');
    }
    public function encrypt($plainText)
    {
        $data = openssl_encrypt($plainText, 'AES-128-CBC', $this->key, OPENSSL_RAW_DATA, $this->iv);
        $data = base64_encode($data);
        return $data;
    }
    public function decrypt($cipher)
    {
        $plainText = openssl_decrypt(base64_decode($cipher),'AES-128-CBC',$this->key,OPENSSL_RAW_DATA,$this->iv);
        return $plainText;
    }
 }

配置信息布署配备在这儿

AES BASE64 优化算法数据加密,前面应用纯JavaS

【强烈推荐学习培训:javascript高级教程】

以上就是关于前面Crypto.jsAES数据加密,PHP openssl_decrypt()破译开展网络信息安全传输的具体内容,大量欢迎关注AdminJS其他类似文章!