欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

使用SLS数据加工对JWT数据进行加解密处理-jwt_encoding

最编程 2024-01-05 13:44:50
...

基于JSON Web Token (JWT)标准,对JSON数据进行编码

  • 函数格式

jwt_encoding(payload, key, algorithm="HS256", headers=None)

  • 参数说明

参数名称

参数类型

是否必填

说明

payload

dict

需要进行jwt编码的数据内容,JSON格式。JWT标准定义了7个字段,用户也可以自定义字段:

  • iss (issuer):签发人
  • exp (expiration time):过期时间
  • sub (subject):主题
  • aud (audience):受众
  • nbf (Not Before):生效时间
  • iat (Issued At):签发时间
  • jti (JWT ID):编号


例如:

{

"iss": "user",

"sub": "name",

"aud": "user1",

"some": "payload"

}

key

String

JWT加密密钥(与选定的加密算法相关):

  • 非对称加密算法:PEM格式编码的私钥
  • 对称加密算法:密钥原文

algorithm

String

对令牌进行签名的算法,默认是HS256。

目前支持的算法有:HS256,
HS384,HS512,ES256,
ES256K,ES384,ES512,
RS256,RS384,RS512,
PS256,PS384,PS512,
EdDSA。

headers

dict

JWT编码头信息,默认是

{

"typ": "JWT",

"alg": "HS256"

}

  • 返回结果

返回编码后的字符串。

编码后的数据解释

包含三部分数据:

  1. Header:头部,通常头部有两部分信息:
  • 声明类型type,这里是JWT(type=jwt)
  • 加密算法,自定义(rs256/base64/hs256)

我们会对头部进行base64加密(可解密),得到第一部分数据

  1. Payload:载荷,就是有效数据,一般包含下面信息:
  • 用户身份信息-userid,username(注意,这里因为采用base64加密,可解密,因此不要存放敏感信息)
  • 注册声明:如token的签发时间,过期时间,签发人等
    这部分也会采用base64加密,得到第二部分数据
  1. Signature:base64加密,签名,是整个数据的认证信息。一般根据前两步的数据,再加上服务的的密钥(secret,盐)(不要泄漏,最好周期性更换),通过加密算法生成。用于验证整个数据完整和可靠性。

头部(header)

头部用于描述关于该JWT的最基本的信息,例如其类型以及签名所用的算法等。这也可以 被表示成一个JSON对象。如:

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

这就是头部的明文内容,第一部分说明他是一个jwt,第二部分则指出签名算法用的是HS256算法。

然后将这个头部进行BASE64编码,编码后形成头部:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

载荷(payload)

载荷就是存放有效信息的地方,有效信息包含三个部分:

(1)标准中注册的声明(建议但不强制使用)

  • iss: jwt签发者
  • sub: jwt所面向的用户
  • aud: 接收jwt的一方
  • exp: jwt的过期时间,这个过期时间必须要大于签发时间
  • nbf: 定义在什么时间之前,该jwt都是不可用的.
  • iat: jwt的签发时间
  • jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。

(2)公共的声明

公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息. 但不建议添加敏感信息,因为该部分在客户端可解密.

(3)私有的声明

私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为base64 是对称解密的,意味着该部分信息可以归类为明文信息。

如:{

 "sub": "1234567890",

 "name": "John Doe",

 "iat": 1516239022

}

上面就是一个简单的载荷的明文,接下来使用base64加密:

eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ

签证(signature)

jwt的第三部分是一个签证信息,这个签证信息由三部分组成:

  • header (base64后的)
  • payload (base64后的)
  • secret

这个部分需要base64加密后的header和base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第 三部分。

总之,jwt_encoding编码后的数据实际上就是一个字符串,有三部分组成:Header.payload.signature,每部分都是通过base64加密而成的