详情请见想全面理解JWT?一文足矣!
JWT
特点:
- 本质也是一种token,但是用可以用json的形式,来携带自定义的信息。token是用户登录的一种凭证。
- 信息可以保存在客户端,服务端无需内存来存储用户信息,只需要校验jwt就行.
组成
- 它由三部分组成,头部、载荷与签名。
- 前两部分,就是json串,用来base64来编码,很容易对其进行解码,所以,载荷部分不能携带一些敏感信息。
生成过程
生成的token,是3段,用.连接。其中:前两段头部和载荷都是通过Base64进行编码的,后最后一段是将前两段(base64编码生成的密文)连接在一起,然后在通过相应的加密算法(这里HS256)进行加密过后的字符串。
注意
- 如果更改前两部分,尤其是第二部分的数据(里面可能包含token的过期时间),那么势必会导致校验的时候,再用HS256来对头部和载荷来生成签名,势必会生成不同的数字签名。
- 如果有人说可以,三个部分都改动,连签名也改动,但是这也是行不通的,因为,服务端在生成数字签名的时候还需要加上一个密码,利用头部,载荷,密码,一起进行hash运算,来生成数字签名。
HS256
- 其本质是一种hash函数
- hash函数的特点: 1,不可逆性,不能对生成的hash值进行解码,得到原来的结果。2,可重复生成。
- HS256签名方式的劣势 如果输入的密码相对弱的话,HS256可能会被暴力破解,基于密钥的技术都有这个问题。更甚的是,HS256要求JWT的生产者和消费者都预先拥有相同的密码。
RS256 JWT签名
-
特点:私钥用来签名JWT,而公钥用来校验JWT
-
使用RS256我们同样需要生成一个MAC,其目的仍然是创建一个数字签名来证明一个JWT的有效性。只是在这种签名方式中就,我们将创建token和校验token的能力分开,只有认证服务器具备创建的能力,而应用服务器,具备校验的能力。
-
仍然需要一个私钥,不过这次它只能被认证服务器拥有,只用来签名JWT。 私钥只能用来签名JWT,不能用来校验它。 第二个密钥叫做公钥(public key),是应用服务器使用来校验JWT。 公钥可以用来校验JWT,但不能用来给JWT签名。 公钥一般不需要严密保管,因为即便黑客拿到了,也无法使用它来伪造签名。