2026-05-13-博客项目
这个项目是用来巩固之前的学习知识的,里面还会涉及到一部分新的内容
JWT
JWT 全称叫作 JSON Web Token 用来解决微服务项目中,Session 不能共享的问题。
执行流程
JWT 的过程是这样:
- 客户端发起请求,服务端会经行统一拦截处理,如果需要令牌,那么就会校验令牌,如果校验不通过,那么就会返回错误信息。
- 客户端收到令牌过期/错误的信息后,会给用户跳到用户登录的页面。
- 在用户输入正确的信息,执行登录后,获取到服务器生成对应的令牌返回给客户端
- 客户端收到令牌后,把它存储在本地上,之后访问服务端都会携带这个令牌
- 服务器接收到了请求,依然会校验令牌的合理性,如果正确,那么就会放行,让客户端收到正确的响应
组成部分
它分为头部,载荷和签名
头部:用来存储加密算法载荷:存储令牌的相关信息,这个是没有加密的签名:用来校验令牌是否正确,这个是防篡改(类似网络原理中的校验和)
JWT配合Redis是可以设置为没有状态的,因此任何人只要拿到对方的JWT,那么就会以对方的身份经行访问。 如果服务端安全性偏低,就可能会出现安全问题当然,一般情况下,只要不乱下载软件,访问公共电脑后及时退出,一般是拿不到对方的
JWT的
加密与解密
目前在数据库中密码是明文存储的,这个显然是不太合适的,因此就要使用加密技术,应该是把密文存储在数据库中
加密类型
| 类型 | 适用场景 |
|---|---|
| 对称加密 | 通过一把锁来加密/解密。 安全性较低,效率较高,在数据传输中是经常使用 |
| 非对称加密 | 分为公钥和私钥,一个用来加密,另一个用来解密。加密和解密只要一对就可以了,不一定是公钥解密,私钥加密 安全性较高,效率较低,一般是在数据建立连接的时候使用 |
| 摘要加密 | 它是不可逆算法,只能加密,不能解密。一般是用来校验数据是否被传改等不需要获取原来数据的场景。 比如密码加密 |
思路
密码加密是使用摘要加密的。 }
- 注册用户:
- 获取到用户输入的明文密码,然后对明文密码加盐后使用
MD5来加密,获取到密文 - 然后把密文和盐按照一定的规则排列,把这个结果存储在数据库中
- 获取到用户输入的明文密码,然后对明文密码加盐后使用
- 用户登录:
- 获取到用户的登录信息,在数据库中查询到相关的 “密码”(密文+盐)
- 根据之前的规则,解析出盐
- 把盐和明文密码按照之前的规则组合起来,使用
MD5加密,判断一下这个结果和密文是否一样
使用盐是可以增加安全性,因为摘要算法是输入固定的值,产生固定的结果。一般情况下,盐可以使用
UUID来表示如果用户输入简单的密码,那么就依然可以比较快速地判断出它的明文
项目部署
由于之前学习过 Docker 而且不想把环境搞得乱七八糟,因此使用 Docker 来部署。
问题
- 请求头中不要使用下划线,因为
Nginx会对它经行处理,这就会导致后面JWT令牌传输出现问题我是使用
1Panel管理,1Panel是使用OpenResty建站,OpenResty是使用Nginx - 如果使用的是香港的服务器,那么推荐使用
Github来管理,而不是Gitee MySQL中需要开启SSL来加密,不然会报出Public Key Retrieval is not allowed这个异常