服务器验证JWT_token的过程

Posted ThinkStu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了服务器验证JWT_token的过程相关的知识,希望对你有一定的参考价值。

Json Web Toke(JWT)是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准RFC7519。

一、先讲加密:

​ 众所周知,JWT token 由三部分组成:Header.Payload.Signature,其中 Signature 的加密形式为:

HMACSHA256(
  base64UrlEncode(Header) + "." 
  + base64UrlEncode(Payload),
  secret_key)

由上面可以知道,Signature 的加密方式为哈希算法,其过程不可逆,也就是说加密后就不可逆,Signature 本身为一串哈希值。(注意:secret_key 作为本次哈希加密的盐值,只存在于各大服务器中,不可泄露)

RFC 7518 - JSON Web Algorithms (JWA) 中给出的 JWT 算法列表如下:

+--------------+-------------------------------+--------------------+
| "alg" Param  | Digital Signature or MAC      | Implementation     |
| Value        | Algorithm                     | Requirements       |
+--------------+-------------------------------+--------------------+
| HS256        | HMAC using SHA-256            | Required           |
| HS384        | HMAC using SHA-384            | Optional           |
| HS512        | HMAC using SHA-512            | Optional           |
| RS256        | RSASSA-PKCS1-v1_5 using       | Recommended        |
|              | SHA-256                       |                    |
| RS384        | RSASSA-PKCS1-v1_5 using       | Optional           |
|              | SHA-384                       |                    |
| RS512        | RSASSA-PKCS1-v1_5 using       | Optional           |
|              | SHA-512                       |                    |
| ES256        | ECDSA using P-256 and SHA-256 | Recommended+       |
| ES384        | ECDSA using P-384 and SHA-384 | Optional           |
| ES512        | ECDSA using P-521 and SHA-512 | Optional           |
| PS256        | RSASSA-PSS using SHA-256 and  | Optional           |
|              | MGF1 with SHA-256             |                    |
| PS384        | RSASSA-PSS using SHA-384 and  | Optional           |
|              | MGF1 with SHA-384             |                    |
| PS512        | RSASSA-PSS using SHA-512 and  | Optional           |
|              | MGF1 with SHA-512             |                    |
| none         | No digital signature or MAC   | Optional           |
|              | performed                     |                    |
+--------------+-------------------------------+--------------------+

二、验证过程

​ 服务器在接收到 token 后,会将 Header.Payload 先提取出来,然后按照之前加密的方式一样,对其进行哈希运算,最终得到一串新的哈希值。

# 这里的加密方式与原先一样
HMACSHA256(
  base64UrlEncode(Header) + "." 
  + base64UrlEncode(Payload),
  secret_key)

服务器将新的哈希值与请求携带过来的 Signature 进行比较,如果一模一样则认证成功;不一样则认证失败。

三、总结

最后总结一下,这种验证方式最主要的安全措施就是把哈希运算的盐值 secret_key 始终保存在各大服务器中,并不对外公布。
但是如果盐值泄露则会造成不可挽回的损失,即其他人也可以拿着盐值对任意用户进行签名,伪造登录。那么如何才能避免这种情况呢?请看我的下一篇博客:使用非对称加密加强JWT验证

JWT Cookie 未正确存储 - Laravel

【中文标题】JWT Cookie 未正确存储 - Laravel【英文标题】:JWT Cookie is not stored right - Laravel 【发布时间】:2016-04-30 00:38:27 【问题描述】:

我正在使用 Laravel 5.1,我正在尝试实现基本的 JWT-Auth 逻辑。

虽然我正在创建 jwt_token 权限(我将其记录到 laravel.log,令牌有它按预期由点划分的三个不同部分),当我尝试使用 jwt_token 值创建一个 cookie 时,a创建了完全不同的 cookie,没有被点分割,它比原来的 jwt_token 大得多。

我认为代码非常简单:

$jwt_token = $this->findOrCreateUser($user);
Log::error('My jwt_token is '. $jwt_token); //from the log here i see the right jwt_token

//i disable the http-only flag because i want to read it with js

return redirect('/index.html')->withCookie(Cookie::make('jwt_token',$jwt_token,1000,null,null,false,false));

如果有人能给我一些关于可能出错的指示,我会很高兴!

谢谢

【问题讨论】:

【参考方案1】:

Laravel 5.1 默认附带一个名为 EncryptCookies 的中间件,该中间件注册在 HTTP 内核的全局 $middleware 数组中。因此 cookie 在发送到浏览器时会自动加密,这就是为什么您的 cookie 值不是您的 JWT 令牌的纯文本表示形式。

您可以通过两种方式轻松解决此问题:

1.将cookie名称添加到App\Http\Middleware\EncryptCookies中的$except数组中:

protected $except = [
    'jwt_token'
];

2. 注释/删除 App\Http\Kernel 类中的 EncryptCookies 中间件(尽管我不建议这样做,除非您特别希望所有 cookie 都未加密):

protected $middleware = [
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    // \App\Http\Middleware\EncryptCookies::class,
    \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
    \Illuminate\Session\Middleware\StartSession::class,
    \Illuminate\View\Middleware\ShareErrorsFromSession::class,
    \App\Http\Middleware\VerifyCsrfToken::class,
];

【讨论】:

谢谢!很好的答案。我应该更仔细地阅读这里的文档laravel.com/docs/5.0/requests#cookies,你是对的!

以上是关于服务器验证JWT_token的过程的主要内容,如果未能解决你的问题,请参考以下文章

如何从 auth0 中的访问令牌中获取 jwt 令牌

我正在尝试在我的 sprin 启动应用程序中应用 auth0 安全性,但它会引发错误

在 Spring Boot 2 上实现基于过滤器的 JWT 身份验证与 OAuth2 JWT 身份验证

使用其他提供商身份验证服务(如 Soundcloud)时令牌身份验证的安全性?

SSH服务远程访问及控制(2.基于密钥的安全验证)

Https之安全Socket