数据对接中的安全性保证及接口设计

主要分为三个方面:

1. 数据传输加密

目前普遍采用SSL协议中相关算法进行传输层的加密,通常是对称的摘要算法(配合证书通过https进行数据对接),或者使用VPN(IPSEC VPN、SSL VPN、MPLS VPN)进行传输甚至专用电路MSTP。

2. 身份认证

目前普遍采用数字证书技术进行身份认证,数字证书具体又可以分为第三方证书和自签名的证书。认证方法又可以分为单向认证和双向认证。

单向认证比较好理解,数据的请求方根据服务方发过来的证书信息验证其是否为合法身份,通过公钥拆解证书来验证,通常服务方的证书为购买的第三方证书。

如果是严格意义上的双向认证,此时服务方需要验证请求方的身份,使用服务方的私钥即跟证来验证,此时通常是由服务方发给请求方的自签名的客户端证书。

国内通常使用的是伪双向认证,即使用异步调用的方式,由服务方将结果再次调用请求方的接口传递过去,同时根据请求方回调接口提供的第三方证书验证请求方的身份合法性。

3. 数据的完整性

主要是指数据的真实性和防篡改。目前通常采用签名算法来保证,如MD5,RSA等。

签名时将字符转化成字节流时指定的字符集保持一致,

根据HTTP协议要求,传递参数的值中如果存在特殊字符(如:&、@等),那么该值需要做URLEncoding,这样请求接收方才能接收到正确的参数值。这种情况下,待签名数据应该是原生值而不是encoding之后的值。例如:调用某接口需要对请求参数email进行数字签名,那么待签名数据应该是:[email protected],而不是email=test%40test.com。

RSA签名方法需要公钥和私钥,数据提供方使用私钥对数据进行加密,并由数据提供方向数据接收方提供公钥进行解密。当数据提供方将数据发送到数据接收方,该数据将被数据提供方私钥进行加签,同时数字签名也将被包括在发送到数据接收方的数据中。

当接收到来自数据提供方数据,数据接收方首先​​构造待签名字符串,然后把待签名字符串、数据提供方提供的公钥、数据提供方提供的参数sign的值三者一同放入RSA的签名函数中进行非对称的签名运算,来判断签名是否验证通过。


在开发过程中,肯定会有和第三方或者app端的接口调用。在调用的时候,如何来保证非法链接或者恶意攻击呢?

1.签名

    根据用户名或者用户id,结合用户的ip或者设备号,生成一个token。在请求后台,后台获取http的head中的token,校验是否合法(和数据库或者redis中记录的是否一致,在登录或者初始化的时候,存入数据库/redis)

在使用Base64方式的编码后,Token字符串还是有20多位,有的时候还是嫌它长了。由于GUID本身就有128bit,在要求有良好的可读性的前提下,很难进一步改进了。那我们如何产生更短的字符串呢?还有一种方式就是较少Token的长度,不用GUID,而采用一定长度的随机数,例如64bit,再用Base64编码表示:

varrnd =newRandom();

vartokenData =userIp+userId;

rnd.NextBytes(tokenData);

vartoken =Convert.ToBase64String(tokenData).TrimEnd('=');

由于这里只用了64bit,此时得到的字符串为Onh0h95n7nw的形式,长度要短一半。这样就方便携带多了。但是这种方式是没有唯一性保证的。不过用来作为身份认证的方式还是可以的(如网盘的提取码)。

2.加密

   客户端和服务器都保存一个秘钥,每次传输都加密,服务端根据秘钥解密。

客户端:

        1、设置一个key(和服务器端相同)

        2、根据上述key对请求进行某种加密(加密必须是可逆的,以便服务器端解密)

        3、发送请求给服务器

服务器端:

        1、设置一个key

        2、根据上述的key对请求进行解密(校验成功就是「信任」的客户端发来的数据,否则拒绝响应)

        3、处理业务逻辑并产生结果

        4、将结果反馈给客户端

3.第三方支持

比如springsecurity-oauth

有兴趣的,可以参考这篇帖子

http://wwwcomy.iteye.com/blog/2230265

你可能感兴趣的:(数据对接中的安全性保证及接口设计)