互联网安全性有关问题
互联网安全性问题
互联网安全性问题
谈到互联网安全,会想起中间人攻击,DNS劫持,代理服务器等,对于这么多的危险,怎么保证我们的系统真的足够安全呢?
一个有效的方法:End to End Encryption(端对端加密)
怎么去理解端对端加密呢?核心有如下两点:
- 客户端和服务端交换期间,数据是加密的
- 既然加密,就用到加密的key,每个客户端使用到的加密key都应该不一样
解决方法:
- 模拟Https的加密流程,生成一个sessionKey,用于加密交互时的数据
- 这种方式经过骇客的评估,确实有效地防止被攻击
问题一:End to End Encryption 过程中,需要拿到后端的公匙,可不可以再改进?
问题关键:
- 现在服务端的public key、private key是固定的,放在服务器的一个安全机器上,能不能将其改成可变的?
解决思路:
- 每次用户需要生成sessionKey的时候,先用deviceId作为key,在redis中查查,看有没有对应吖pubic key、private key,如果有就拿出来用,如果没有就重新生成一对。
- 因为deviceId每台机器都不一样,所以生成的public key、private key是不一样的。
问题二:即使做好了加密,如果被人拦截到请求的所有数据,怕不怕被用来重复提交
问题关键:
- 这种敏感的请求,应该有个超时时间来记录什么时候无效
解决思路:
- 客户端发起请求时,生成一个timeStemp,这是当前时间5分钟后的时间。
- 服务端拿到请求后,首先检查timeStemp,看这个时间是否超过当前时间,如果超过就是无效的,如果不超过就是有效的。
- 那在这5分钟的时间内,怎么保证不会被重复请求呢?
- 使用redis做分布式锁,在第一次请求时,看拿不拿得到redis的一个key,看拿不拿得到。
- 如果拿得到,证明已经执行过了,可以直接抛异常。
- 如果拿不到,证明还没有执行过,那就执行请求。
- key的超时时间是5分钟,5分钟后自动删除,这样就可以补充这5分钟的空隙了。