`
youyu4
  • 浏览: 440224 次
社区版块
存档分类
最新评论

互联网安全性问题

 
阅读更多

互联网安全性问题

 

 

       谈到互联网安全,会想起中间人攻击,DNS劫持,代理服务器等,对于这么多的危险,怎么保证我们的系统真的足够安全呢?

 

 

 

一个有效的方法:End to End Encryption(端对端加密)

 

    怎么去理解端对端加密呢?核心有如下两点:

 

  • 客户端和服务端交换期间,数据是加密的
  • 既然加密,就用到加密的key,每个客户端使用到的加密key都应该不一样

 

解决方法:

 

  1. 模拟Https的加密流程,生成一个sessionKey,用于加密交互时的数据
  2. 这种方式经过骇客的评估,确实有效地防止被攻击

 

流程

 

  1. 前端请求后端拿到public key
  2. 前端生成一个16位的cKey(UUID),用public key加密,传给后端
  3. 后端拿到加密内容后,用private key解密,拿到cKey
  4. 后端又生成一个16位的sKey(UUID),然后两个key一起做异或,生成一个sessionKey
  5. 将cKey,sKey,sessionKey保存到DB,而且数据要进行加密的,并且有一个sessionId(UUID)作为唯一标识,sessionId不用加密
  6. 然后用cKey加密sKey和sessionId返回给前端,前端用自己的cKey解密,拿到sKey
  7. 然后前端做一次异或,生成一个sessionKey保存在App的runtime
  8. 每次请求的参数,以userId=1&name=AA这样的一个字符串用sessionKey进行加密,然后sessionId放在请求的header中,
  9. 后端拿到数据后,先根据sessionId找到数据库对应的sessionKey 和 IV,然后解密这两个值,然后再用这另个值来解密encData。

 

 

 

 

问题一:End to End Encryption 过程中,需要拿到后端的公匙,可不可以再改进?

 

问题关键:

 

  1. 现在服务端的public key、private key是固定的,放在服务器的一个安全机器上,能不能将其改成可变的?

 

解决思路:

 

  1. 每次用户需要生成sessionKey的时候,先用deviceId作为key,在redis中查查,看有没有对应吖pubic key、private key,如果有就拿出来用,如果没有就重新生成一对。
  2. 因为deviceId每台机器都不一样,所以生成的public key、private key是不一样的。

 

 

 

 

问题二:即使做好了加密,如果被人拦截到请求的所有数据,怕不怕被用来重复提交

 

问题关键:

 

  1. 这种敏感的请求,应该有个超时时间来记录什么时候无效
  2. 同时,不能重复使用

 

解决思路:

 

  1. 客户端发起请求时,生成一个timeStemp,这是当前提交的时间。
  2. 服务端拿到请求后,首先检查timeStemp,跟当前时间比较,看是否超过5分钟,如果超过就是无效的,如果不超过就是有效的。
  3. 那在这5分钟的时间内,怎么保证不会被重复请求呢?
  4. 使用redis做分布式锁,设置一个clientRef(16位UUID)作为key,在第一次请求时,看拿不拿得到redis的一个key。
  5. 如果拿得到,证明已经执行过了,可以直接抛异常。
  6. 如果拿不到,证明还没有执行过,那就执行请求。
  7. key的超时时间是5分钟,5分钟后自动删除,这样就可以补充这5分钟的空隙了。

 

 

 

问题三:如果跟第三方系统交互,要防止请求数据被中间人篡改了,怎么办?

 

关键问题:

 

  1. 怎么检查被篡改过?数字签名

 

解决思路:

 

  1. 先跟第三方约定数字签名的加密算法,如:SHA256
  2. 第三方请求过来时,生成timeStamp,clientRef,以及request json body一起组成一串字符串,用算法进行加密,名字叫signature(数字签名)
  3. 第三方请求中,header中,放timeStamp,clientRef,signature
  4. 我们服务端收到请求后,将timeStemp,clientRef,request json body,以相同的规则,组成字符串,再用算法进行加密
  5. 加密后的值和signature比较,看是否相等
  6. 如果相等就没问题,不相等就抛异常

 

如何改进:

 

  1. 可以从加密算法中改进,可以用Hash,对称加密,非对称加密(事先要把public key的证书给第三方)
  2. timeStamp,clientRef,signature,组成字符串的规则可以跟第三方约定好,保证不会那么容易被猜到

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics