加签、验签的做用
常见的http请求交互过程当中,请求参数经过url或者request body等形式传输。可是因为http请求的开放性,使得请求参数很容易被拦截篡改。所以,须要对请求参数进行加签,而后在请求接受方对请求参数进行验签,确保两个签名是同样的,验签经过以后请求处理方就能够进行业务逻辑处理了。算法
可是,加签和验签只能解决请求传输过程当中参数篡改的问题,并不能解决敏感参数传输的安全性问题。api
加签、验签的处理思路
加签和验签就是在请求发送方将请求参数经过加密算法生成一个sign值,放到请求参数里;请求接收方收到请求后,使用一样的方式对请求参数也进行加密获得一个sign值,只要两个sign值相同,就说明参数没有被篡改。安全
签名参数sign生成的方法
- 将因此头参数(注意时全部参数),出去sign自己,以及值是空的参数,按参数键字母升序排序。
- 而后把排序后的参数按参数1值1参数2值2......参数n值n(这里的参数和值必须是传输参数的原始值,不能是通过处理的,如不能将"转成"后再拼接)的方式拼接成一个字符串。
- 把分配给接入方的验证密钥key拼接在第2步获得的字符串前面。
- 在上一步获得的字符串前面加上密钥key(这里的密钥key是接口提供方分配给接口接入方的),而后计算md5值,获得32位字符串,而后转成大写,获得的字符串做为sign的值放到请求参数里。
举例
如今假设须要传输的数据是:http://xxx.com/api/guest/rechargeNotify?p2=v2&p1=v1&method=cancel&p3=&pn=vn(实际状况最好是经过post方式发送)post
- 拼接字符串,首先去除值是空的参数p3,剩下p2=v2&p1=v1&method=cancel&pn=vn,而后按参数名字符升序排序获得字符串:method=cancel&p1=v1&p2=v2&pn=vn。
- 而后作参数名和值的拼接,最后获得methodcancelp1v1p2v2pnvn。
- 在上面拼接获得的字符串前面加上验证密钥key,假设是abc,获得新的字符串abcmethodcancelp1v1p2v2pnvn。
- 将上面获得的字符串进行md5计算,假设获得的是abcdef,而后转为大写,获得ABCDEF这个值即为sign签名值。最终产生的url应该以下:http://xxx.com/api/guest/rechargeNotify?p2=v2&p1=v1&method=cancel&p3=&pn=vn&sign=ABCDEF
- 注意:计算md5以前请确保请求发送方和接收方使用的字符串编码一致,好比统一使用utf-8编码,若是编码方式不一致则计算出来的签名会校验失败。
验签过程
其实就是将请求url按照上述的规则进行一样的操做,计算获得参数的签名值,而后和参数中传递的sign值进行对比,若是一致则校验经过,不然校验不经过。阿里云
阿里云加签方式
签名机制编码
参考优秀博文
- HTTP对外接口,如何增长签名机制