5

I problemi di sicurezza: Secondo https://auth0.com/blog/2015/03/31/critical-vulnerabilities-in-json-web-token-libraries/ molte librerie JWT utilizzano il token stesso per determinare l'algoritmo per la firma.Token Web JSON sicuro in Web API/MVC 6

Questo è il nostro caso d'uso: Vogliamo creare un meccanismo di accesso che convalida un utente con le credenziali rigide (nome utente/password) e quindi restituire un token JWT con ad es. 3 giorni di vita. Il token deve contenere il nome utente e una firma dovrebbe garantire che il token non possa essere "falsificato".

Quale libreria è possibile utilizzare in Web API/MVC 6? È importante che l'algoritmo della firma possa essere specificato sulla decodifica per evitare la vulnerabilità.

Se possibile, evitiamo di integrare componenti OAuth complessi.

+0

Dopo appena po 'di googling ho trovato due cose interessanti: progetto open source su GitHub - JWT-dotnet: h ttps: //github.com/jwt-dotnet/jwt e JSON Web Token Handler per Microsoft .NET Framework 4.5 su NuGet: https://www.nuget.org/packages/System.IdentityModel.Tokens.Jwt/ Sembra come se entrambi potessero offrire generazione e validazione di token JWT, tuttavia non li ho usati, – jjczopek

+0

li ho visti. Non so se offrono lo spec.of algo sulla convalida. – Matthias

risposta

3

Sto utilizzando la libreria System.IdentityModel.Tokens.Jwt e ho appena controllato questo problema. Ho generato un token e l'ho convalidato in uno dei miei test, quindi ho rimosso lo signingCredentials che modifica l'alg in none. Il JWT generato con la convalida "alg":"none"fallita.

Ecco come sto generazione del token:

public string GenerateToken(SSOContext context, SignatureSettings settings) 
{ 
    var token = new JwtSecurityToken(
     issuer: "MyIssuer", 
     audience: "MyAudience", 
     claims: GetClaims(context), 
     //comment the below line to generate a 'none' alg 
     signingCredentials: new X509SigningCredentials(settings.Certificate), 
     notBefore: DateTime.UtcNow, 
     expires: DateTime.UtcNow.AddHours(1) 
     ); 

    return new JwtSecurityTokenHandler().WriteToken(token); 
} 

Quando ho convalidare il token ottengo un'eccezione come previsto con il messaggio

IDX10504: Impossibile convalidare la firma, pedina non lo fa avere una firma :

+0

Mentre leggevo i commenti in rete sulla vulnerabilità, l'unico modo per essere sicuri sarebbe quello di definire l'algo atteso sulla validazione hardcoded. Questo è possibile con questa libreria? Almeno non sarebbe vulnerabile a nessun problema di algo perché capisco la tua risposta. Forse puoi confermare o aggiungere ulteriori informazioni. – Matthias

+2

Puoi prendere il jwt e trasformarlo in un oggetto JwtSecurityToken e controllare la proprietà SignatureAlgorithm per assicurarti che sia anche ciò che è previsto. Altrimenti non potresti nemmeno preoccuparti di convalidare e respingerlo. [collegamento] (https://msdn.microsoft.com/en-us/library/system.identitymodel.tokens.jwtsecuritytoken (v = vs.114) .aspx) Se vedi qualcosa di sbagliato, per favore fammelo sapere. Sto rispondendo in parte per vedere se qualcuno ha notato un errore. – TylerReid

+1

Tutto questo sembra ragionevole e solido per me. Penso che accetterò la tua risposta molto presto. Non sono sicuro di poter testare fino alla fine della ricompensa. Quindi suppongo di doverlo accettare subito dopo per evitare la perdita del premio. – Matthias

Problemi correlati