Json web token (JWT)原理

01、什么是JWT:

Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519)。
该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。

02、JWT作用:

  • 保证数据的完整性!

02-1、3个特性

JWT就相当于一个令牌,这个令牌具备以下3个特性:

  • 0、令牌是后端签发给用户

  • 1、记录用户身份信息

  • 2、可以被验证真伪

02-2、多点登陆

使用JWT这项技术,就可以实现多点登陆

多点登陆:客户端在任意一台服务端完成登陆之后,服务端签发令牌(token);之后,该用户可以使用该令牌在任意其他的服务器中完成身份认证!!

03、JWT实现原理

03-1、jwt令牌(token值)其实就是一个字符串

token字符串用**“点”**隔开分三段;并且是经过编码的!

"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ"

03-2、三段组成

03-2.1 第一段字符串,称之为头信息(header)

# python中的一个字典
header = {
  'typ': 'JWT', # 类型/格式
  'alg': 'HS256' # 哈希算法,使用该算法生成token字符串的第三部分
}

# 上述的字典数据经过编码后得出token字符串的头信息
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"

03-2.2 第二段字符串,称之为载荷(payload)

载荷信息就是存储的用户信息!

# python中的一个字典,记录用户信息
payload = {
  "username": 'haige',
	"user_id": 1
}

# 上述的字典数据经过编码之后得出的token字符串的载荷信息
"eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9"

03-2.3 第三段字符串,称之为签名(signature)

签名的作用就是验证整个token字符串的真伪

校验的逻辑:签发token的时候使用一个密钥生成签名部分,如果用户修改了token的header和payload信息,由于没有密钥,用户无法生成对应的第三部分签名数据;我们后台把用户的header和payload重新签发新的签名,如果header和payload没有被改动的话,新旧签名应该是一致!

# 签名生成和校验的原理
# =======签名生成操作流程========
#  1、把token前两段字符串拼接(点隔开),这个字符串称之为“信息摘要”
message = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9"
# 2、准备一个用户生成签名的密钥——该密钥保证生成的签名唯一,且不被篡改
secret = "FEWGHTrhty5hHY%HJ$uybyju46ju6juj5iu"
# 3、使用哈希/散列算法配合密钥得出签名
signature = HS256(message, secret)

# 得到了签名字符串
"TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ"


# =======签名校验操作流程========
token = "fewferwhjgbrehwgEGTTE.grbnehgbhtjuerw.gtrbwhguktbrhwgjktur"
# 1、把前端传过来的token中提取三段数据
header = "fewferwhjgbrehwgEGTTE"
payload = "grbnehgbhtjuerw"
signature = "gtrbwhguktbrhwgjktur"
# 2、把header和payload拼接,然后使用HS256配合密钥重写签发一个签名
message = header + '.' + payload
new_signature = HS256(message, secret)
# 3、把新旧签名比对,如果一致则说明数据没有被篡改
if signture == new_signature:
  # 没有篡改
else:
  # 被篡改了

04、结语:

个人记录,新手入门,多多学习,欢迎大家交流探讨!
个人网站: http://106.54.78.238/
song_of _sea的个人网站 http://106.54.78.238/

猜你喜欢

转载自blog.csdn.net/weixin_44824717/article/details/108041715