2016-07-14 9 views
1

Я читал обзор jjwt библиотеки:jwt: Почему алгоритм подписи не нужен при проверке токена JWT?

Построение маркера осуществляется следующим образом:

import io.jsonwebtoken.Jwts; 
import io.jsonwebtoken.SignatureAlgorithm; 
import io.jsonwebtoken.impl.crypto.MacProvider; 
import java.security.Key; 

// We need a signing key, so we'll create one just for this example. Usually 
// the key would be read from your application configuration instead. 
Key key = MacProvider.generateKey(); 

String compactJws = Jwts.builder() 
    .setSubject("Joe") 
    .signWith(SignatureAlgorithm.HS512, key) 
    .compact(); 

И токен проверяется как:

try { 

    Jwts.parser().setSigningKey(key).parseClaimsJws(compactJws); 

    //OK, we can trust this JWT 

} catch (SignatureException e) { 

    //don't trust the JWT! 
} 

SignatureAlgorithm.HS512 не используется на втором фрагменте. Как это можно сделать? Или это не нужно?

ответ

2

Поскольку JWT включает в себя алгоритм в заголовке, так что валидатор знает, какой алгоритм следует использовать просто декодирования первой части маркеров

Например, если вы декодировать первые части этого маркера (тест на https://jwt.io/)

eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.O8YgYdD1YxficWfO_06nDsm_YgDdXmgMM4CN3bLor5c 

соответствует

{ 
    "alg": "HS512", 
    "typ": "JWT" 
} 
+0

Но разве вам не нужен алгоритм для декодирования этой первой части? –

+0

№ Заголовок (первая часть) и полезная нагрузка (вторая часть) кодируются base64url. Алгоритм подписи необходим только для проверки подписи (третьей части) – pedrofb

+0

ok Я предполагаю, что я должен внимательно ознакомиться с документами RFC. Спасибо –

1

в @pedrofb упоминает алгоритм удобно включен в заголовок, а в са se асимметричного алгоритма вы также можете найти ключ, который использовался с помощью параметра заголовка kid.

Heads вверх, что вы должны быть очень осторожны, чтобы только позволяют алгоритмы, которые вы ожидать при декодировании. В противном случае вы можете принять токен, подписанный с alg=none, по существу, в обход любой проверки.

Большинство декодеров имеют поддержку для этого (и если они этого не делают, они должны). Ваш конкретный пример, хотя, кажется, вызывает беспокойство, как

//OK, we can trust this JWT 

не может быть правдой, если ваш анализатор также принимает alg=none. Так что будьте аккуратнее!

+0

Nice point Pieter! –

Смежные вопросы