认证流程总结
1.用户的新增密码的加密存储:一般使用不可逆加密
我们使用的是BCrypt(是一种加盐的不可逆加密方法)
@Override
public void add(Admin admin){
String password = BCrypt.hashpw(admin.getPassword(), BCrypt.gensalt());
admin.setPassword(password);
adminMapper.insert(admin);
}
2.登录验证:
//验证密码, Bcrypt为spring的包, 第一个参数为明文密码, 第二个参数为密文密码
BCrypt.checkpw(admin.getPassword(),admin2.getPassword());
3.登录后签发token(jwt):
为什么要用token,因为http是无状态的,无法区分是哪个用户访问的,是否登录过,所以就有了会话机制,一个用户的请求都在一个会话中
会话跟踪技术是一种在客户端与服务器间保持 HTTP 状态的解决方案,我们所熟知的有 Cookie + Session、URL 重写、Token 等。
Cookie 在浏览器保存 SessionID、Session 实际内容保存在服务端,目前的项目都是前后端分离 + 微服务,所以会面临 Session 共享问题,随着用户量的增多,开销就会越大。URL 重写又是通过明文传输,不安全容易被劫持。
Token 的优势:
- Token 支持跨域访问,Cookie 不可以跨域访问。
- Token 支持多平台,Cookie 只支持部分 web 端。
JWT简介:
jwt分为三部分(hand(base64编码)、payload(base64编码)、signature),
头部携带加密方式
payload有一些标准的,存储一些认证时间、过期时间的消息,不是一定要使用,但是推荐使用,还可以自定义一些存储权限信息
signature就是签名,对hand和payload 用base64编码后再进行加密,加密方式不显示,可使用对称和非对称
HS256加密:
signature = HMACSHA256( base64UrlEncode(header) + "." +base64UrlEncode(payload), secret );
RS256加密:
signature = RSASHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload), publicKey, privateKey)
如何避免篡改:因为payload只是使用了base64进行编码,base64并不是加密方式,所以内容可以解码,虽然可以解码修改,但是因为signature是基于hand和payload加密的,修改后签名认证失败,所以能避免篡改
4.认证token
token的公钥和密钥都存储在服务端,可以生成后直接用,也可以单例启动的时候创建一个
想做的复杂一点,可以按照OAuth2认证标准区分为access_token和refresh_token,双 Token 保证 活跃用户
access_token过期时间很短,refresh_token刷新时间较长,mango中access_token过期时间是5分钟
优点:
1.access_token时间不易设置的过长,因为如果access_token泄露,拿到access_token就可以一直访问系统
2.如果只使用access_token,过期时间也设置的比较短,签发一次后,到过期时间,用户就要重新登录,如果用户正在使用系统就很不合理
刷新流程:
使用Token,用户登录后,同时签发两个token,比如access_token过期时间是5分钟,refresh_token过期时间是1小时,用户平时访问系统的时候携带access_token,服务端进行验证,当发现access_token过期时,
客户端携带refresh_token请求,服务端验证refresh_token还未过期,刷新access_token和refresh_token,refresh_token的过期时间也刷新至未来1小时,两个都过期时提醒用户进行登录
加密算法种类有:
1.可逆加密算法
解释: 加密后, 密文可以反向解密得到密码原文.
1.1. 对称加密
【文件加密和解密使用相同的密钥,即加密密钥也可以用作解密密钥】
解释: 在对称加密算法中,数据发信方将明文和加密密钥一起经过特殊的加密算法处理后,使其变成复杂的加密密文发送出去,收信方收到密文后,若想解读出原文,则需要使用加密时用的密钥以及相同加密算法的逆算法对密文进行解密,才能使其回复成可读明文。在对称加密算法中,使用的密钥只有一个,收发双方都使用这个密钥,这就需要解密方事先知道加密密钥。
优点: 对称加密算法的优点是算法公开、计算量小、加密速度快、加密效率高。
缺点: 没有非对称加密安全.
用途: 一般用于保存用户手机号、身份证等敏感但能解密的信息。
常见的对称加密算法有: AES、DES、3DES、Blowfish、IDEA、RC4、RC5、RC6、HS256
1.2. 非对称加密
【两个密钥:公开密钥(publickey)和私有密钥,公有密钥加密,私有密钥解密】
解释: 同时生成两把密钥:私钥和公钥,私钥隐秘保存,公钥可以下发给信任客户端.
加密与解密:
私钥加密,持有私钥或公钥才可以解密
公钥加密,持有私钥才可解密
签名:
私钥签名, 持有公钥进行验证是否被篡改过.
优点: 非对称加密与对称加密相比,其安全性更好;
缺点: 非对称加密的缺点是加密和解密花费时间长、速度慢,只适合对少量数据进行加密。
用途: 一般用于签名和认证。私钥服务器保存, 用来加密, 公钥客户拿着用于对于令牌或者签名的解密或者校验使用.
常见的非对称加密算法有:RSA、DSA(数字签名用)、ECC(移动设备用)、RS256 (采用SHA-256 的 RSA 签名)
2.不可逆加密算法
解释: 一旦加密就不能反向解密得到密码原文.
种类: Hash加密算法, 散列算法, 摘要算法等
用途: 一般用于效验下载文件正确性,一般在网站上下载文件都能见到;存储用户敏感信息,如密码、 卡号等不可解密的信息。
常见的不可逆加密算法有: MD5、SHA、HMAC
3.Base64编码
Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一。Base64编码可用于在HTTP环境下传递较长的标识信息。采用Base64Base64编码解码具有不可读性,即所编码的数据不会被人用肉眼所直接看到。注意:Base64只是一种编码方式,不算加密方法。
在线编码工具: