JWT原理

简介


JWT是什么

一种认证机制,让后台知道请求是否来自于受信的客户端。
这个图中有三个主体:user, application server和authentication server
首先用户需要通过登录等手段向authentication server发送一个认证请求,authentication会返回给用户一个JWT
此后用户向application server发送的所有请求都要捎带上这个JWT,然后application server会验证这个JWT的合法性,验证通过则说明用户请求时来自合法守信的客户端。

JWT的内容

JWT的格式:header.playload.signature
  • header:包含typ和alg,typ为JWT的类型,alg为加密算法
  • playload:用户的一些信息,相当于告诉认证端自己的身份
  • signature:签名,由hash算法生成的一串能够认证身份的字符串

header和playload都是可以用base64解码直接得到明文,所以JWT的主要作用是认证来源,而不是数据加密与保护

signature的内容就是header+playload拼接并用密钥进行hash,再进行base64编码得到的

密钥采用对称加密或者非对称加密

认证原理

因为在JWT中包含着用户的信息,所以认证时,只要将header与playload按照同样的方法进行一次哈希,比对哈希值与JWT中的signature部分是否一致即可。

BCryptPasswordEncoder原理

加密与Hash


加密算法是一种可逆的算法,基本过程就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码为“密文”,但在用相应的密钥进行操作之后就可以得到原来的内容。
哈希算法是一种不可逆的算法,是把任意长度的输入通过散列算法变换成固定长度的输出,输出就是散列值,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。

加密


  1. 根据输入的值与随机加密盐salt进行加密;
  2. 对加密盐salt进行处理,获取真正的salt(加密时不会改变),并使用base64解码;
  3. 将加密盐salt与哈希值进行base64编码放入最终的加密字符串中

匹配


  1. 匹配输入的密码与加密后的哈希密文是否一致时,将用户输入的明文作为需要加密的字符,哈希密文作为加密盐salt
  2. 将哈希密文中包含的加密盐salt信息提取出来,将明文按照同样的加密盐salt进行哈希
  3. 判断明文哈希之后的字符与哈希密文是否一致,一致则明文正确