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),设置过期时间为前端请求有效时间。

  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,免费好用。

  如果有任何漏洞欢迎指出 ~

posted @ 2020-09-08 23:31  乀醉梦丶  阅读(5609)  评论(1编辑  收藏  举报