Chinaunix首页 | 论坛 | 博客
  • 博客访问: 174032
  • 博文数量: 340
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 3405
  • 用 户 组: 普通用户
  • 注册时间: 2021-05-14 14:39
文章分类

全部博文(340)

文章存档

2023年(69)

2022年(144)

2021年(127)

我的朋友

分类: 云计算

2022-10-25 09:59:44

JSON Web Token(简称JWT),是一个开放安全的行业标准,可以用于多个系统之间传递安全可靠的信息(也包括本文中将要用到的传递身份认证信息的场景)。

一个JWT的token字符串组成如下:

    1)红色的为Header:指定token类型与签名类型;
    2)紫色的为载荷(playload):存储用户id等关键信息;
    3)蓝色的为签名:保证整个信息的完整性、可靠性(这个签名字符串,相当于是一段被加密了的密文文本,安全性就是由它来决定的)。

JWT的头部用于描述关于该JWT的{BANNED}最佳基本的信息,例如其类型以及签名所用的算法等。

这可以被表示成一个JSON对象:

{
  "typ": "JWT",
  "alg": "HS256"
}

▲ 在这个头信息里,标明了这是一个JWT字符串,并且所用的签名算法是HS256算法


在载荷(playload)中可以定义以下属性:

    1)iss: 该JWT的签发者;
    2)sub: 该JWT所面向的用户;
    3)aud: 接收该JWT的一方;
    4)exp(expires): 什么时候过期,这里是一个Unix时间戳;
    5)iat(issued at): 在什么时候签发的。


上面的信息也可以用一个JSON对象来描述,将上面的JSON对象进行base64编码,可以得到下面的字符串。

JWT的签名部分,在官方文档中是如下描述的:

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

上述伪码的意义,即如下操作:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiIyOWZmMDE5OGJlOGM0YzNlYTZlZTA4YjE1MGRhNTU0NC1XRUIiLCJleHAiOjE1MjI0OTE5MTV9

▲ 将上面的两个base64编码后的字符串都用句号‘.’连接在一起(头部在前),就形成了如下字符串

{BANNED}最佳后,我们将上面拼接完的字符串用HS256算法进行加密。在加密的时候,我们还需要提供一个密钥(secret)。

那么,按照RFC7519上描述的方法,就可以得到我们加密后的内容:

P-k-vIzxElzyzFbzR4tUxAAET8xT9EP49b7hpcPazd0

▲ 这个就是我们需要的JWT的签名部分了

生成JWT的token字符串的{BANNED}最佳后一步签名过程,实际上是对头部以及载荷内容进行加密。

一般而言:加密算法对于不同的输入产生的输出总是不一样的。所以,如果有人对头部以及载荷的内容解码之后进行修改,再进行编码的话,那么新的头部和载荷的签名和之前的签名就将是不一样的。而且,如果不知道服务器加密的时候用的密钥的话,得出来的签名也一定会是不一样的。

换句话说:你的JWT字符串的安全强度,基本上就是由这个签名部分来决定的。

使用时:服务器端在接受到JWT的token字符串后,会首先用开发者指明的secret(可以理解为密码)对头部和载荷的内容用同一算法再次签名。那么服务器应用是怎么知道我们用的是哪一种算法呢?别忘了,我们在JWT的头部中已经用alg字段指明了我们的加密算法了。

如果服务器端对头部和载荷再次以同样方法签名之后发现,自己计算出来的签名和接受到的签名不一样,那么就说明这个Token的内容被别人动过的,我们应该拒绝这个JWT Token,返回一个HTTP 401 Unauthorized响应。即时通讯聊天软件app开发可以加蔚可云的v:weikeyun24咨询

JWT的整个技术原理,就是一个很典型的对称加密应用过程,通俗的说也就是用开发者在服务端保存的密码,对用户的id等信息进行加密并按照JWT的规则(见5.1节)组成字符串返回给用户。用户在使用时将这个字符串提交给对应的服务端,服务端取出JWT字串的头信息、载荷,用开发者指明的密码试着进行加密并得到一个字符串(即合法的JWT token),两相比较,相同则认为用户提交上来的JWT合法,否则不合法。这就是JWT的全部原理,相当简单易懂。

JWT技术的价值不在于具体的技术实现,而在于它的思想本身,尤其在异构系统、分布式系统方面,可以极大的简化安全认证的成本,包括简化架构复杂性、降低使用门槛等,因为JWT的技术原理决定了认证的过程不需要其它系统的参与,由当前实例自已就可以完成,而成认证代码极小(就是一个加密字符串的比较而已)。

当然,我们之所以选择JWT技术,主要看重的还是它简单易用,但或许正因为如此,某种程度上来说这也恰是居致它的缺点的原因所在。

JWT技术的缺点及建议的解决方法主要有:

    1)JWT的{BANNED}最佳大缺点是服务器不保存会话状态,所以在使用期间不可能取消token或更改token的权限。也就是说,一旦JWT签发,在有效期内将会一直有效;
    2)JWT本身包含认证信息(即你在第5.1节中看到的头信息、负载信息),因此一旦信息泄露,任何人都可以获得token的所有权限。为了减少盗用,JWT的有效期不宜设置太长。对于某些重要操作,用户在使用时应该每次都进行进行身份验证;
    3)为了减少盗用和窃取,JWT不建议使用HTTP协议来传输代码,而是使用加密的HTTPS(SSL)协议进行传输。


阅读(231) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~