我正在开发服务器-客户端 Web 应用程序,作为身份验证方案,我正在发布 base64 编码的json web tokens。考虑以下令牌...
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
解码成这样...
{
"alg": "HS256", // header
"typ": "JWT"
},
{
"sub": "1234567890", // payload
"name": "John Doe",
"admin": true
},
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), 'secret') // signature
我关心的是payload
这个令牌的一部分,我希望在其中提供定义的声明,例如"role": "readonly"
. 我担心这些值一旦发布就会被最终用户看到和篡改。修改这部分不会使签名检查无效。我不希望在服务器上保留任何数据以重新检查/比较颁发的令牌 - 我希望保持服务器完全无状态。
我想也许可以签署令牌,通过 AES 256 对其进行加密,并将其用作我的“令牌”。流程将被总结为......
- 生成并签署 base64 编码的令牌
- 通过 AES 256 加密令牌服务器端
向客户端颁发加密令牌
收到请求,提供加密令牌
- 解密令牌服务器端
- 验证 base64 编码的原始令牌签名(现在能够确保声明未被更改)
我的想法是,不会看到声明(有效负载),并且任何篡改此加密值的行为显然都不会像预期的服务器端那样解密。我的问题是——这可行吗?我在网上找不到太多用于加密整个令牌的信息。有没有更好的方法?