前言: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