uni 小程序 AES请求封装

文章目录

    • AES
    • 依赖
  • 函数准备
    • 基本使用 CBC方式 封装功能函数
    • 字典排序+md5加密函数 主要用于sign值
    • 完整代码 示例

AES

前端同学在写项目时 大多项目使用的安全手段都是token,这种方式对前端后端来说都无疑是繁琐且安全性不高的方案。
对于安全较要求高的项目 往往推荐Aes加密方式

依赖

npm i crypto-js
引入 crypto-js 包

函数准备

基本使用 CBC方式 封装功能函数

import CryptoJS from 'crypto-js'
const strKey="";  //十六位十六进制数作为密钥
const iv= '';      //十六位十六进制数作为偏移量

// 加密函数
function encrypt(str) {
	var key1 = CryptoJS.enc.Utf8.parse(strKey);
	var iv1 = CryptoJS.enc.Utf8.parse(iv);
	var encrypted = CryptoJS.AES.encrypt(str, key1, {
		iv: iv1,
		mode: CryptoJS.mode.CBC,
		padding: CryptoJS.pad.Pkcs7
	});
	return encrypted.toString();
}
 
//解密
function decrypt(str) {
	var key1 = CryptoJS.enc.Utf8.parse(strKey);
	var iv1 = CryptoJS.enc.Utf8.parse(iv);
	var decrypt = CryptoJS.AES.decrypt(str, key1, { 
		iv:iv1,
		mode: CryptoJS.mode.CBC,
		padding: CryptoJS.pad.Pkcs7
	});
	return decrypt.toString(CryptoJS.enc.Utf8);
}
//加密
encrypt('只能传入字符串')
//解密
decrypt('只能传入字符串')

字典排序+md5加密函数 主要用于sign值

字典排序函数

function ksort(o) {
	let str = '';
	let keys = Object.keys(o);
	keys.sort();
	keys.forEach((key)=>{
		str+=`${key}=${o[key]}&`;
	})
	// 加密
	return CryptoJS.MD5(str.substr(0, str.length - 1)).toString();
}

ksort(传入对象)

完整代码 示例

这里使用时间戳和随机数+data数据 然后md5加密 作为sing

import {baseUrl} from "@/common/config.js"

// 加密
import CryptoJS from 'crypto-js'
const strKey="";  //十六位数作为密钥
const iv= '';      //十六位数作为偏移量


// 加密函数
function encrypt(str) {
	var key1 = CryptoJS.enc.Utf8.parse(strKey);
	var iv1 = CryptoJS.enc.Utf8.parse(iv);
	var encrypted = CryptoJS.AES.encrypt(str, key1, {
		iv: iv1,
		mode: CryptoJS.mode.CBC,
		padding: CryptoJS.pad.Pkcs7
	});
	return encrypted.toString();
}
 
//解密
function decrypt(str) {
	var key1 = CryptoJS.enc.Utf8.parse(strKey);
	var iv1 = CryptoJS.enc.Utf8.parse(iv);
	var decrypt = CryptoJS.AES.decrypt(str, key1, { 
		iv:iv1,
		mode: CryptoJS.mode.CBC,
		padding: CryptoJS.pad.Pkcs7
	});
	return decrypt.toString(CryptoJS.enc.Utf8);
}

// 对象按照key排序
function ksort(o) {
	let str = '';
	let keys = Object.keys(o);
	keys.sort();
	keys.forEach((key)=>{
		str+=`${key}=${o[key]}&`;
	})
	// 加密
	return CryptoJS.MD5(str.substr(0, str.length - 1)).toString();
}

const timeout = 3000;

function request({
	url,
	method,
	data={},
}) {

	return new Promise((resolve, reject) => {
		// 请求数据
		let timestampV = new Date().getTime(),
		    verifyV = Math.floor( (Math.random()*(20000-100)+100) ),
		    accountV = uni.getStorageSync('accountid'),
		aesObj={
			'timestamp':timestampV,
			'verify':verifyV,
			'account_id':accountV,
			'sign':'',
		};
		aesObj.sign=ksort({
			'timestamp':timestampV,
			'verify':verifyV,
			...data,
		});
		console.log(JSON.stringify(aesObj))
		var headers = {
			'appid': '58949fscdb14e373',
			'token':encrypt(JSON.stringify(aesObj)),
		};
		
		
		return uni.request({
			url: baseUrl + url,
			data,
			method:method.toUpperCase(),
			timeout,
			header:headers,
			success: (res) => {
				resolve(res.data)
			},
			fail: (err) => {
				reject(err)
			},
			complete(){
			}
		})
	})
}
//暴露
export {
	request
}


//使用
import {
	request
} from "@/common/request.js"

export const test= data => {
	return request({
		url: "/test/index",
		method: "post",
		data,
	});
}

test()

你可能感兴趣的:(小程序,javascript,前端)