前后端的通信安全,若想完全保障,则要使用https,从tcp层保证传输安全,但https从证书申请、搭建、到使用,成本感人,目前国内只有主流大型网站使用。目前大多数网站还是使用的http。
用户的密码在传输时必须是密文,由于前端代码本就是暴露的,即便通过加密混淆也可以反解,所以前端的加密方法必须是不可逆的,若可逆则只能防小白。
所以通过算法的安全性保证传输安全。
以登录为例。
密码安全性
方法一,N次Md5
1.数据库存储的密码字段为md5Hex + DES(AES)。
2.前端首先对密码进行单次Md5摘要CryptoJS.MD5(value).toString(CryptoJS.enc.Base64),Date.now()获取当前时间stime,根据stime尾数(0-9)再进行n次Md5,尾数为6,也就是循环6遍Md5摘要,stime的随机性使每次Md5摘要值都不同,可简单防范。
3.后端对比密码是否正确时,首先从数据库读取密码存储的密文字段,再进行DES解密, 然后根据stime, 对dbPassword进行多次Md5运算,将运算结果与前端传的摘要密码对比即可。过程如下
DesUtil工具类代码如下:
|
|
方法二,前端加盐
1.数据库存储的密码字段为加盐后的摘要。
2.前端加盐后再单次摘要, 加盐建议重写异或而不是简单字符串拼接。然后根据stime做n次摘要,方法同上
3.后端从数据库取出字段,做n次摘要后,与前端传输的密码比对即可。
传输安全,身份认证,防简单攻击
- 所有请求,均加摘要。前端获取当前时间ostime,与请求参数拼接后做一次摘要,即MD5(params + ostime),同时将ostime传给后端,后端收到请求后,按相同方法算一次摘要,与前端传的摘要比对,相同则合法,否则返回401。防重放攻击,但攻击者通过分析前端代码可以模拟正常请求。
- 后端对所有请求进行时间合法性判断,与服务器时间比对,30秒以内则认为合法。简单的防重放攻击。
- 后端记录每个ip的每个路径的最近访问时间,本次访问时间-上次访问时间大于100ms,否则不可访问接口,返回401。
- 用户身份信息存储在session中,对于登录后调用的接口,后端判断session中是否有身份信息,没有则返回403。攻击者可以进行cookie劫持和session获取进行攻击,开发者可通过使用session的同时引入token防御。
- 能使用https一定不要使用http。
题外话
之前写了一个客户端内嵌WebView与浏览器访问页面的安全机制,在那个项目,用户身份认证使用的token策略,token身份认证一般是用于客户端和服务器通信(CS),客户端可将token存储到本地数据库;前后端(BS)的身份认证则是cookie-session。