Https加密过程及作用
https保证传输过程的安全。注意是‘传输过程’,也就是说,客户端请求服务器的过程中,请求被中间人拦截,中间人拿到的是被加密过后的数据,无法解密的。
加密的过程:
这里涉及两个概念。
1.对称加密
对称加密,双方商定一个密码并同时持有,该密码可对数据进行加密解密。比较典型的加密算法:AES。
2.非对称加密
RSA比较有影响力的非对称加密算法,非对称加密,生成一对公钥私钥。公钥提供给客户端,私钥自己保留,公钥加密过后的报文只有私钥可以解开,同理,私钥加密的报文只有公钥才可以解开。
缺点,RSA加密解密的过程根据报文的大小逐渐增加消耗时长。Java中就对RSA报文大小有限制(128k),超过限制只能选择分段加密。对性能有很大影响。
https的加密过程
1.浏览器通过https访问服务器,此时服务器会颁发证书及其一个非对称加密的公钥。
2.客户端拿到公钥后,产生一串随机数,该随机数作为对称加密秘钥,并用公钥对该数字进行加密,发送给服务器。
3.此时双方同时持有了对称加密秘钥,该秘钥会对接下来的传输过程进行加密。
加密的过程可以分为非对称加密与对称加密。以上步骤可以看出非对称加密目的是为了保证双方持有对称加密的同时不被泄露。
其原因是,非对称加密消耗性能的缺点,整个握手过程中,非对称加密就要占用90%的时间,而对称加密要比非对称加密快1500倍。
api业务接口安全问题
伪造、篡改请求问题
https保证了传输层的安全,但不会确保业务层。
比如,网站页面想后台接口发出一个请求,通过抓包等方式可以看到接口地址、出参、入参等信息。此时用户可以伪造、篡改请求发送给服务器。
解决方式:
天下没有绝对安全的系统,魔高一尺道高一丈,一下方案是我们生产再用的方式,综合 性能、稳定、成本考虑。加密的安全程度取决于你舍得放弃多少成本去做这个东西。
1、用户登录成功后除了返回 用户信息外(token),还要给出一个秘钥。
2、用户拿到 秘钥后,保存到本地,秘钥不再参与后续的网络传输过程中,只用于签名。
3、发起请求时,客户端产生签名(sign),所有的参数进行字典排序(秘钥参与其中),对排序后的参数进行MD5,得到的值就是签名。此处有一个公共参数的概念,就是说所有请求都会有这么个公共参数。比如说 时间戳、机型等信息,时间戳的用处,可以用于服务端的请求有效值校验,另一作用是混淆同样(不含公共)参数产生的sign。
4、服务端接到请求后,同样将所有参数(用户秘钥参与)进行字典排序并进行md5,将值与客户端产生的sign进行对比。相同则请求没被篡改、伪造。 此处可以取出参数中的时间戳进行有效期校验(根据需求)。
这个方案的缺陷在于,当用户发现了你的加密方式,并在登录时获取到了秘钥,同样可以伪造篡改请求。这种信息给到客户端的,没有很好的办法保证数据不泄露。同样的https也只是保证不被中间人劫持,毕竟加密的秘钥都给到了客户端。