【Java】【通信安全】怎么保证http请求的安全性

106 篇文章 6 订阅
95 篇文章 2 订阅

要保证http请求的安全性,首先我们得知道,http有哪些安全隐患,再针对每个问题,寻找对策。
先有问题,才有解决方法,不要空谈技术。

假设我们的电脑上被人偷偷安装了窃听软件,或者我们使用的路由器,代理服务器被人安装了抓包软件,这样我们的ip,所有通信数据,都是可以被别人轻松捕获的。
网页源码只需打开浏览器控制台,所有人都可以看到。如果是Java代码,也可以通过反编译看到。
现在,我们的ip,通信数据,代码,完全暴漏在别人手里,我们在这样的场景下,来寻找一个安全方案。先从简单情景说起

Q:我们的登录密码可以直接被别人看到,别人只需监听一次登录请求,拿到你的密码,就可以去做任何事情
A:对密码,交易数据等涉及安全和隐私的敏感数据进行加密,这样别人就无法直接看到敏感数据了

Q:我们的用户标识userId可以直接被别人看到,别人只要使用我们的userId,就能以我们的身份去模拟操作
A:从保密敏感数据的角度来说,我们可以对userId进行加密,但实际别人仍然可以用加密后的userId和password向服务端去发请求,只是麻烦一点,不像直接拿到你的密码,不通过代码就可以直接登录应用去做任何事情
这种情况下,我们可以使用token技术,服务端登录后,并不会返回给你userId,而是返回给你一个token,这个token存储在服务端,对应你的userId,你通过token去向服务器发请求,而token是设置了有效时间的,一般为几小时或几分钟,这样即便别人知道了你的token,也只能在短时间内做破坏
token并不能保证安全,因为别人照样可以模拟你的登录请求,自己去获取token
token主要作用是用来替代userId去发请求的,从而保密敏感数据,同时由于其时效性,起到了辅助安全的作用

Q:我们来继续上面的问题,假如别人拿到了我们的token,并且立刻拿着我们的token,模拟我们的身份去做坏事怎么办
又或者,别人拿到我们加密后的密码,直接去模拟登录请求,获取新的token,再去搞破坏怎么办

A:我们可以将密码和时间戳混在一起进行加密,这样每次的加密结果都不一样,即便被截取也没法进行复用
我们的token也可以和时间戳,内容等一起加密发送,这样别人就无法知道我们使用的token是什么了
服务端返回的token,也可以是加密的,客户端再解析,这样即使被拦截,别人也不知道真实内容是什么

Q:如果我不希望被别人看到任何的数据,要怎么办
A:可以将整个请求体的数据一起加密,然后服务端去解密

Q:如果我不希望请求被别人拦截修改,要怎么办
A:加密是一种方案,加密后别人就不知道该怎么修改,但是如果别人胡乱修改,会增加服务端解密解析的难度
另一种专业的做法是,对整个请求体部分进行签名,所谓签名就是给数据生成校验码,当数据被改变时,新的数据就和校验码不匹配了
我们将签名放到请求头里面,服务端收到请求后,将签名和请求体内容进行对比,就知道请求有没有被修改,这种方式不但安全,编码实现也简单,逻辑清晰
我们也可以把整个请求体加密,再进行签名,这样就更加安全

Q:如果有人复制我的请求,拿去攻击服务器怎么办
A:服务端进行签名记录,拒绝相同签名的请求
有时我们可能确实需要连续发出内容相同的请求,这时我们把时间戳也放到请求里面,这样生成的签名就不一样了

Q:如果别人知道网页代码,可以自己去加密解密,生成签名怎么办
A:javascript和java的代码,源码都是可以直接被看到或轻松被反编译的,所以我们需要对代码进行混淆,打乱正常的代码内容,让别人无法阅读
虽然理论上混淆的代码仍然可能被推断出来,但是配合加密,签名等方案,其破解成本是极其昂贵的,基本上是安全的了

Q:https协议是什么,怎么保证服务器安全的
A:https就是http+SSL,在http的基础上添加一套SSL协议,专门用来保证http安全
SSL也是使用加密,解密,签名,校验等方式来对保证安全的,只不过它是一套专门的安全协议,有着标准完善的规范
SSL是传输层协议,它是对整个http数据包进行加密,而不是请求参数进行加密
后面我们会专门开篇文章来讲解https协议,因为https协议不需要我们自己去实现,这里不需要讲解太细

Q:加密技术要考虑这么多事情,编码起来岂不是特别麻烦
A:确实,如果各种方案都使用上,会让客户端和服务器编码都变复杂,而且会影响到服务器性能
所以一般只对关键环节才使用多种安全方案,其它地方使用一种方案即可

综上所述,我们的安全方案有token,加密(混合加密),签名,混淆,重复请求校验等
对于一般应用来说,基本上做到以下点就够了:
?代码混淆,最直接的方式,可以保护加密解密签名算法
?不直接使用userId等字段,而是有时效的临时token
?密码,token等敏感数据配合时间戳,干扰字符进行加密
?对整个请求体进行签名,防止被修改
?服务端通过签名,时间戳进行完整性,时效性和重复校验
?向权威CA机构申请SSL证书,服务器使用Https协议

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值