前几日做微信小程序开发,针对静态页面项目,假如涉及的隐秘数据较多,大家一般采用前端后端开展插口数据加密解决,使用的是 AES BASE64 优化算法数据加密,前面应用纯JavaScript的加密技术标准库crypto-js开展数据库加密,后面应用PHP openssl_decrypt()破译开展网络信息安全传送~
高端数据加密规范(AES,Advanced Encryption Standard)为比较常见的对称加密算法(小程序数据加密就是通过这一加密技术的)。对称加密算法其实就是加密和解密用同样的密匙,具体数据加密步骤如下图所示:
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原形上
之后在需要使用的办法上直接启用此方法就行了,如下图:
后面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;
}
}
将配置信息布署配备在这儿
【强烈推荐学习培训:javascript高级教程】
以上就是关于前面Crypto.jsAES数据加密,PHP openssl_decrypt()破译开展网络信息安全传输的具体内容,大量欢迎关注AdminJS其他类似文章!