Skip to content

2026-05-13-博客项目 ​

这个项目是用来巩固之前的学习知识的,里面还会涉及到一部分新的内容

JWT ​

JWT 全称叫作 JSON Web Token 用来解决微服务项目中,Session 不能共享的问题。

执行流程 ​

JWT 的过程是这样:

  1. 客户端发起请求,服务端会经行统一拦截处理,如果需要令牌,那么就会校验令牌,如果校验不通过,那么就会返回错误信息。
  2. 客户端收到令牌过期/错误的信息后,会给用户跳到用户登录的页面。
  3. 在用户输入正确的信息,执行登录后,获取到服务器生成对应的令牌返回给客户端
  4. 客户端收到令牌后,把它存储在本地上,之后访问服务端都会携带这个令牌
  5. 服务器接收到了请求,依然会校验令牌的合理性,如果正确,那么就会放行,让客户端收到正确的响应

组成部分 ​

它分为头部,载荷和签名

  • 头部:用来存储加密算法
  • 载荷:存储令牌的相关信息,这个是没有加密的
  • 签名:用来校验令牌是否正确,这个是防篡改(类似网络原理中的校验和)

JWT 配合 Redis 是可以设置为没有状态的,因此任何人只要拿到对方的 JWT,那么就会以对方的身份经行访问。 如果服务端安全性偏低,就可能会出现安全问题

当然,一般情况下,只要不乱下载软件,访问公共电脑后及时退出,一般是拿不到对方的 JWT 的

加密与解密 ​

目前在数据库中密码是明文存储的,这个显然是不太合适的,因此就要使用加密技术,应该是把密文存储在数据库中

加密类型 ​

类型适用场景
对称加密通过一把锁来加密/解密。

安全性较低,效率较高,在数据传输中是经常使用
非对称加密分为公钥和私钥,一个用来加密,另一个用来解密。加密和解密只要一对就可以了,不一定是公钥解密,私钥加密

安全性较高,效率较低,一般是在数据建立连接的时候使用
摘要加密它是不可逆算法,只能加密,不能解密。一般是用来校验数据是否被传改等不需要获取原来数据的场景。

比如密码加密

思路 ​

密码加密是使用摘要加密的。 }

  1. 注册用户:
    1. 获取到用户输入的明文密码,然后对明文密码加盐后使用 MD5 来加密,获取到密文
    2. 然后把密文和盐按照一定的规则排列,把这个结果存储在数据库中
  2. 用户登录:
    1. 获取到用户的登录信息,在数据库中查询到相关的 “密码”(密文+盐)
    2. 根据之前的规则,解析出盐
    3. 把盐和明文密码按照之前的规则组合起来,使用 MD5 加密,判断一下这个结果和密文是否一样

使用盐是可以增加安全性,因为摘要算法是输入固定的值,产生固定的结果。一般情况下,盐可以使用 UUID 来表示

如果用户输入简单的密码,那么就依然可以比较快速地判断出它的明文

项目部署 ​

由于之前学习过 Docker 而且不想把环境搞得乱七八糟,因此使用 Docker 来部署。

问题 ​

  1. 请求头中不要使用下划线,因为 Nginx 会对它经行处理,这就会导致后面 JWT 令牌传输出现问题

    我是使用 1Panel 管理,1Panel 是使用 OpenResty 建站,OpenResty 是使用 Nginx

  2. 如果使用的是香港的服务器,那么推荐使用 Github 来管理,而不是 Gitee
  3. MySQL 中需要开启 SSL 来加密,不然会报出 Public Key Retrieval is not allowed 这个异常