https请求还需要对参数做签名吗?答案是需要的,但不必须。
https本身基于安全证书传输数据,在数据传输过程中已经对数据做了加密处理,但是他本身属于传输层协议,所以只能保证传输的安全性。
那什么是签名?
签名分为加签和验签,客户端加签,服务端验签。客户端在调用接口的时候,对入参会按照某种规则进行MD5计算得到sign值,然后再把该值作为入参发送给服务端,服务端拿到所有参数后剔除签名,再按照同样的规则对入参进行MD5计算得到一个MD5值,再和客户端的MD5值进行比对,比对正确代表验签成功,否则验签失败。
例如原始参数参数:
加签规则
1,按照参数属性key的ASCII排序并以&符号拼接参数
2,拼接上秘钥key
3,MD计算得到签名sign
拼接后的字符串:”name=卧龙凤雏&age=1000&key” md5后得到 xxxxx,那最终传给服务端的参数如下:
{“name”:”卧龙凤雏”,”age”:1000, “sign”:”xxxxx”}
服务端拿到参数sign,并对原始参数加签,然后比对客户端的sign,如果比对正确即为通过。
看到这里大家应该明白了,https和加签是两种操作方式。
签名目的1,防止数据被篡改
https可以最大限度保证传输层的安全,但是证书是有可能泄露的,一旦证书泄露数据就等于在裸奔。
数据到网关后,做负均衡通过http的方式把请求转发到下游服务,在转发的过程中数据是不安全的,因为各种原因数据可能会丢失或者被篡改。
转账或者收款场景里如果收款人的卡号在数据传输过程中,被篡改成别人的卡号,我们服务端是没法感知到的,所以必须通过验签的方式来保证数据数据一致性,不能被篡改。
2,防止接口被恶意调用。那是如何防止恶意调用的呢?加签一般都是需要给客户端分配业务码和密钥的,错误的业务码或者密钥加签后的值和服务端的加签值肯定是不一样的,长时间一个接口总是验签失败,事有反常必有妖,就得引起注意了。
3,接口幂等
有些地方会用这个秘钥作为接口幂等的判断,也是可以的,防止同样的参数调用多次,污染数据。
适合签名的场景
签名毕竟是影响效率的,所以一般对数据较为敏感,安全性要求极高的场景里使用签名。比如金融,支付,个人信息传输的场景里比较适合。
签名算法
最简单,也是最普遍的一般都是MD5+秘钥的方式,这个类似于对称加密,服务端和客户端秘钥都一样,最安全的方式还是使用RSA非对称的方式,使用公钥加密,私钥解密,可以充分提高安全性。