Paseto密钥

传统JWT

不同于session, 无状态token不被存储进数据库, 服务端只能验证它是否是由自己签发。一个传统jwt是这样的:

Header:

1
2
3
4
{
"alg": "HS256",
"typ": "JWT"
}

Payload:

1
2
3
4
5
{
"id": "??", // 可以是雪花算法生成的唯一id, 也许是为了保证每个瞬间签发的token不一样
"expirted_at": 1698349006, // 用来控制过期的字段
// .. 更多字段, 这些字段都应该是公开的, 我们不对它们进行加密, 这些是会暴露给外界的
}

Signature:

1
2
3
4
base64UrlEncode(HMACSHA256(
base64UrlEncode(header)+"."+base64UrlEncode(payload)+".",
"your-secret-key"
))

组合上面的所有信息, token就是:

1
base64UrlEncode(header)+"."+base64UrlEncode(payload)+"."+Signatrue

为什么需要用base64编码并用.分隔? 这是base64编码后就不会包含.符号, 这样很方便能用字符串操作把三个部分都拿出来。

PASETO

jwt的一个很low的点就是公开了信息。比如加密算法和一些公开信息, 而公开这些信息是完全不必要的, 也许会因为泄漏这些”公开信息”而造成麻烦。paseto则直接对payload进行了对称加密, 这样拿到token的人将无法获得任何”公开信息”, paseto不公开算法和payload。

一个paseto是这样的形式:

1
v2.local.AAAAA.BBBBB

AAAAA包含了加密版本的payload信息, BBBBB包含了企业信息的base64编码。要实现这样一个token直接用对称加密就完了, 这个token的v2用的协议是AES256 CTR + HMAC SHA384

go中生成PASETO

不必多说, 调轮子就完了

https://github.com/o1egl/paseto#key-differences-between-paseto-and-jwt