如今的互联网,明文传输数据已是相当危险,寒假长达半年期间在家也简单写出了http加密传输数据以及如何避免重放攻击(Replay-Attack)。
进入正题,博主用到的后端Java框架SpringBoot,高速缓存Redis;前端JavaScript库crypto-js、jsencrypt。
首先要了解常见的加密方式:
1.对称加密 对称密钥加密,又称私钥加密,即信息的发送方和接收方用一个密钥去加密和解密数据。它的最大优势是加解密速度快, 适合于对大数据量进行加密,但密钥管理困难。常见对称加密工具有AES、DES。
2.非对称加密 非对称密钥加密,又称公钥密钥加密。它需要使用一对密钥来分别完成加密和解密操作,一个公开发布,一个私有储存。公钥加密的数据只有唯一的私钥解密,缺点是对大数据量加密很慢,可能影响性能。常见非对称加密工具有RSA、DSA。
3. 散列校验 属于不可逆加密,对不同的数据加密的结果是定长的,对原数据进行任何改动所得到的散列值都有很大区别,但对相同的数据加密,得到的结果相同。常见散列工具有MD5、SHA1、SHA256。
设计思路
登录
1. 前端在输入密码时向后端发送请求 (input焦点监视器)。
2. 后端随机生成nonce、当前timestamp以及前后端提前协商的salt,通过nonce+timestamp+salt随机组合散列生成定长字符串作为sign返回客户端。
3. 前端进行timestamp超时检查 ( 安全情况下,超时范围在5秒以内,超过5秒则认为此nonce不安全 )。
4. 前端用后端同样方法生成sign并比对请求的sign是否完全相同,若不相同则认为此nonce被篡改。
5. 点击登录发送账号 (username)、当前时间戳 (timestamp) 和SHA256 ( 账号 + 数据库散列密码方式(密码) + 时间戳 ) 生成的Token
6. 后端判断当前时间与请求中时间戳间隔 ( 正常情况下,客户端请求最多为1分钟,若超过1分钟则认为请求已过期 ) ,若未超时,将Token和timestamp放入redis中
7. 检查Redis中Token与timestamp是否存在(判断方式:先检查Token是否存在,若存在则检查timestamp是否相同)
8. 若不存在则将Token与timestamp储存到Redis中 (储存方式:key: token value: timestamp)
9. 后端通过账号(username)获取用户数据,再通过SHA256(username+密文密码+时间戳)生成token,若token不匹配则返回用户名密码错误(参数被修改或密码输入错误)
注册
有空再说