HTTP请求通过添加时间戳(timestamp)和随机码(nonce)简
单解决安全传输问题
如今的互联⽹,明⽂传输数据已是相当危险,寒假长达半年期间在家也简单写出了http加密传输数据以及如何避免重放攻击(Replay-Attack)。
进⼊正题,博主⽤到的后端Java框架SpringBoot,⾼速缓存Redis;前端js安全库crypto-js、jsencrypt。
常见加密⽅式:
 1.对称加密对称密钥加密,⼜称私钥加密,即信息的发送⽅和接收⽅⽤⼀个密钥去加密和解密数据。它的最⼤优势是加解密速度快,适合于对⼤数据量进⾏加密,但密钥管理困难。常见对称加密⼯具有AES、DES。
 2.⾮对称加密⾮对称密钥加密,⼜称公钥密钥加密。它需要使⽤⼀对密钥来分别完成加密和解密操作,⼀个公开发布,⼀个私有储存。公钥加密的数据只有唯⼀的私钥解密,缺点是对⼤数据量加密很慢,可能影响性能。常见⾮对称加密⼯具有RSA、DSA。
 3. 散列校验散列校验⼜称签名,散列属于不可逆加密,对不同的数据加密的结果是定长的,对原数据
进⾏任何改动所得到的散列值都有很⼤区别,但对相同的数据加密,得到的结果相同。常见散列⼯具有MD5、SHA1、SHA256。
执⾏流程:
 登录
  1. 前端在输⼊密码时向后端发送请求 (焦点事件)。
  2. 后端随机⽣成nonce、当前timestamp以及前后端协商的salt(盐),通过nonce+timestamp+salt随机组合散列⽣成定长字符串作为sign ⼀并返回前端。
  3. 后端保存request的sessionId和nonce到Redis中,取出nonce需要相同的sessionId。
  4. 前端进⾏timestamp超时检查 ( 安全情况下,超时范围在5秒以内,超过5秒则认为此nonce不安全 )。
  5. 前端⽤后端同样⽅法⽣成sign并⽐对请求的sign是否完全相同,若不相同则认为此nonce被篡改。
  6. 点击登录发送账号 (username)、当前时间戳 (timestamp) 和 Token [ SHA256( 账号+SHA256(密码)+时间戳+nonce ) ]。
  7. 后端判断当前时间与请求中时间戳间隔 ( 正常情况下,客户端请求最多为1分钟,若超过1分钟则认为请求已过期 ) 。
  8. 检查Redis中Token与timestamp是否存在 ( 判断⽅式:先检查Token是否存在,若存在则检查timestamp是否相同 ),存在表⽰这是⼀个重复请求。
  9. 若不存在则将Token与timestamp储存到Redis中 (储存⽅式 => key: token | value: timestamp),设置过期时间为前端请求有效时间。
java加密方式有哪些
  10. 后端通过账号(username)前往数据库获取⽤户数据,再通过SHA256( username+数据库SHA256密码+请求的timestamp+本地nonce )⽣成token。
  11. 若token与请求token不匹配则返回⽤户名密码错误,反之写⼊Session并返回登录成功。
 注册
  1. 注册唯⼀区别就是后端也要拿到密码,同样的输⼊密码时向后端发送请求。
  2. 后端⽣成RSA密钥将私钥与sessionId储存到Redis中,同理取出私钥需要相同的sessionId。
  3. 公钥⽤[发送nonce相同的⽅法]发送pubkey、timestamp、sign。
  4. 前端同登录做超时( timestamp )和签名( sign )检查。
  5. 前端使⽤散列 ( 随机数+时间戳+固定salt ) 取随机位数⽣成16位AesKey。
  6. 点击发送时发送⽤户名(username),密码 [ AES( password ) ] ,当前timestamp,skey [ RSA( AesKey ) ] 和 sign [ RSA( SHA256( username+password+timstamp ) ) ]。
  7. 后端通过sessionId取得RSA私钥解密skey、sign,再⽤AesKey解密password。
  8. 使⽤登录相同的⽅式检查当前请求是否过期(timestamp)。
  8. 使⽤前端相同⽅式⽣成签名[ SHA256( username+password+timstamp ) ]与解密的sign做⽐对 ( 期间任何解密或校验失败都认为本次请求已被篡改 )。
  9. 检查sign是否在Redis中且timestamp是否相同,若相同则认为这是重复请求,不相同则同登录相同⽅式存⼊Redis中。
  10. 后端通过username判断⽤户是否已注册,未注册则写⼊数据库 (密码推荐使⽤SHA256储存) 并返回注册成功。
* 注册的加密传输⽅式可适⽤于⼤的数据加密,因为RSA始终加密AES秘钥,不会影响性能。js的salt长度不限但在前端是明⽂显⽰,可以使⽤js加密加⼤破解难度,推荐sojsonv6,免费好⽤。
如果有任何漏洞欢迎指出 ~

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。