最近的新项目需要考虑到安全性的需求,为了防止别人盗刷接口,就在请求拦截器里对所有接口请求进行了参数加密校验,校验不通过后端就会将请求拦截,从而达到加密的目的。
前端加密逻辑
加密方法:
// utils/sign.js
import md5 from 'blueimp-md5'// 密钥
const MD5_SIGN_KEY = 'abc123'const md5Func = (obj) => {let keys = Object.keys(obj).sort()let sign = ''keys.forEach(item => {if (obj[item]) {sign += obj[item].toString()}})// 拼接密钥sign += MD5_SIGN_KEY// md5加密sign参数return md5(sign)
}export { md5Func }
前端拦截器配置:
// utils/http.js
import axios from 'axios'
import { md5Func } from '@/utils/sign'const http = axios.create({baseURL: process.env.VUE_APP_BASE_API,timeout: 5000
})// request 拦截器
http.interceptors.request.use(config => {if (config.method.toLocaleUpperCase() === 'GET') {config.query = {...config.query,sign: md5Func(config.query || {})}}if (config.method.toLocaleUpperCase() === 'POST') {config.body = {...config.body,sign: md5Func(config.body || {})}}},error => {return Promise.reject(error)}
)// response 拦截器
service.interceptors.response.use(response => {if (data.code !== 200) {return Promise.reject(newError(data.message || 'Error'))} else {return data}},error => {return Promise.reject(error)})export default http
原理:前后端维护同一个密钥,将参数加密为sign参数,后端用同样的方法加密,比对前端的sign参数是否一致,一致则校验通过,不一致则校验不通过。
后端加密逻辑,以PHP举例
function verify($data=[]) {// 密钥$secretKey='abc123'ksort($data);$sign = '';foreach($data as $key => $value) {if ($key != 'sign') {$sign .= $value;}}$sign .= $secretKey$sign = md5($sign)// 比较前端传过来的签名与后端计算的签名是否一致if ($sign == $data['sign']) {return true;} else {return false;}
}