api接口sign签名主要作用就是防止参数被非法篡改,提高接口的安全性。
非法篡改最常见的是修改金额等重要敏感参数, sign的值一般是将所有非空参数按照升续排序然后+token+key+timestamp+nonce(随机数)拼接在一起,然后使用某种加密算法进行加密,作为接口中的一个参数sign来传递,也可以将sign放到请求头中。
接口在网络传输过程中如果被黑客挟持,并修改其中的参数值,然后再继续调用接口,虽然参数的值被修改了,但是因为黑客不知道sign是如何计算出来的,不知道sign都有哪些值构成,不知道以怎样的顺序拼接在一起的,最重要的是不知道签名字符串中的key是什么,所以黑客可以篡改参数的值,但没法修改sign的值,当服务器调用接口前会按照sign的规则重新计算出sign的值然后和接口传递的sign参数的值做比较,如果相等表示参数值没有被篡改,如果不等,表示参数被非法篡改了,就不执行接口了
下面是vue 实现sign签名的一种方式,可以根据实际需求做相应的修改就可以使用
import MD5 from 'js-md5'
/**
* 签名算法
* @param data
* @returns {string}
*/
export function getSign(data) {
const keysSorted = Object.keys(data).sort()
let str = ''
for (let i = 0; i < keysSorted.length; i++) {
str += keysSorted[i] + '=' + (data[keysSorted[i]]!=null?data[keysSorted[i]]:'')
}
return MD5(str).toUpperCase()
}