为什么要签名验证?
我们通过 httpPost 或者 Get 方式请求服务器的时候,会面临着许多的安全性问题,例如:
1、请求来源(身份)是否合法?
2、请求参数被篡改?
3、请求的唯一性(不可复制)
项目中用户登录后以后才能访问的信息,请求 api 接口的时候为了安全,需要做签名验证。
签名验证实现原理
1、用户登录成功后服务器会返回用户信息以及 salt
salt 是用户注册的时候随机生成的字符串然后通过 md5 加密得到的,每个用户的 salt 不一样
2、请求接口的时候在接口中加入 sign 签名
如以前的请求方式:
http://jd.itying.com/api/addressList?uid=5a18fe9983796b0dc0542f99
现在的请求方式:
http://jd.itying.com/api/addressList?uid=5a18fe9983796b0dc0542f99&sign=fee452295f3a1d40e e90dc8e974885e9
3、sign 签名的生成算法
var json={
aid:1,
ame:'zhangsan',
age:20,
sex:'男',
}
vararr=[];
for(variinjson){
arr.push(i);
}
//如果这个参数被省略,那么元素将按照 ASCII 字符顺序进行升序排列(也就是所谓的自然 顺序) arr=arr.sort();
varstr='';
for(vari=0;i<arr.length;i++){
str+=arr[i]+json[arr[i]]
}
console.log(str);
返回结果:age20aid1namezhangsansex 男
varsign=Md5.hashStr(str);
这时候就得到了 sign 签名
4、请求接口传入 sign
http://jd.itying.com/api/addressList?uid=5a18fe9983796b0dc0542f99&sign=fee452295f3a1d40e e90dc8e974885e9
5、服务器端生成签名验证:
1. 获取客户端传过来的 sign 和 参数
2. 根据 uid 去数据库查询当前用户的 salt(32 位)
3. url 获取的数据和数据库查询的 salt 组合成 json 用同样的算法生成签名
4. 用服务器的签名和客户端的做对比如果一样表示没有篡改。