JWT(Json Web Token)介绍

前言:JWT(JSON Web token)是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。JWT是REST API中经常使用的一种机制。

JWT是一种由Header、PayLoad和Key计算并组合得到的数字令牌。简单点说就是一个字符串,由三部分组成,分别是:头部(Header)、载荷(PayLoad)、签名(sign)。

一、各部分介绍及使用体验

 

Header:

Header为JSON格式,用于描述关于该JWT的最基本的信息,例如类型以及签名采用的算法等。

如下说明这是一个JWT,且采用的签名算法是HS256算法。

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

//对应Json串
string raw_head = "{\"alg\":\"HS256\",\"typ\":\"JWT\"}";

 base64urlencode后为:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

PayLoad:

PayLoad也为JSON格式,主要描述一些签名参数内容,例如:

{
"appId": 1255566655,
"fileId": "4564972818519602447",
"currentTimeStamp": 1546340400,
"expireTimeStamp": 1546344000,
"urlAccessInfo": {
  "t": "5c2b5640",
  "rlimit": 3,
  "us": "72d4cd1101"
}
}

//对应Json串
string raw_payload = "{\"appId\":1255566655,\"fileId\":\"4564972818519602447\",\"currentTimeStamp\":1546340400,\"expireTimeStamp\":1546344000,\"urlAccessInfo\":{\"t\":\"5c2b5640\",\"rlimit\":3,\"us\":\"72d4cd1101\"}}";

  base64urlencode后为:eyJhcHBJZCI6MTI1NTU2NjY1NSwiZmlsZUlkIjoiNDU2NDk3MjgxODUxOTYwMjQ0NyIsImN1cnJlbnRUaW1lU3RhbXAiOjE1NDYzNDA0MDAsImV4cGlyZVRpbWVTdGFtcCI6MTU0NjM0NDAwMCwidXJsQWNjZXNzSW5mbyI6eyJ0IjoiNWMyYjU2NDAiLCJybGltaXQiOjMsInVzIjoiNzJkNGNkMTEwMSJ9fQ

KEY:

Key就是计算签名时使用的秘钥(就是一个字符串例如"24FEQmTzro4V5u3D5epW")。

 

签名Sign:

将上面的Header和PayLoad序列化一下后分别进行base64urlencode(注意:base64和base64url不是一个东西,参见 https://blog.csdn.net/mijichui2153/article/details/116128452 );encode后的结果上面也贴出来了。

接下来就是计算签名,计算签名的方法为指定一个秘钥Key然后对字串进行计算: Signature = HMACSHA256(base64UrlEncode(Header) + "." + base64UrlEncode(Payload), KEY)。

这里我们得到签名Signature为:“TRdfy-ctQFRDJzknfKsT0di5tEaweAVumOgxsA8Qd-8”。

 

最终Token:

公式如下:Token = base64UrlEncode(Header) + '.' + base64UrlEncode(Payload) + '.' + base64UrlEncode(Signature)

将上述字串拼起来即可。

 

二、其他的一些点

1、JWT官网 https://jwt.io/ 。其中列举了各种主流语言的JWT实现。

2、https://github.com/benmcollins/libjwt 这个C语言库的star较多,时间较长,所以应该比较稳定。

https://github.com/arun11299/cpp-jwt 这个库比较新,A C++14 library for JWT。Tested with clang-5.0 and g++-6.4.  VS2017 is also supported.
因为项目不支持C++14,所以没有使用这个库,但是,看起来很有前途的样子。

3、感觉仅仅计算签名的话不一定非要用这些第三方库,按照上述规则硬算也是可以得到token的(注:上述的Json序列化成json串就可以了)。

 

参考:

https://www.freebuf.com/vuls/219056.html

https://blog.csdn.net/weixin_30786657/article/details/98557373

 

你可能感兴趣的:(协议,jwt)