Maison  >  Article  >  Pris dans une erreur. La validité de JWT ne peut pas être affirmée et ne doit pas être fiable

Pris dans une erreur. La validité de JWT ne peut pas être affirmée et ne doit pas être fiable

王林
王林avant
2024-02-15 09:18:071129parcourir

L'éditeur php Banana a souligné que lors de l'utilisation de JWT (JSON Web Tokens), vous devez noter que sa validité ne peut pas être affirmée et ne doit pas être fiable. JWT est un jeton utilisé pour l'authentification et l'autorisation, mais en raison de sa nature autonome, une fois le jeton falsifié, sa validité ne peut être garantie. Par conséquent, lors de l'utilisation de JWT, nous devons prendre des mesures de vérification strictes, notamment la vérification des signatures, du délai d'expiration, etc., et ne pas stocker d'informations sensibles dans JWT pour éviter les risques de sécurité.

Contenu de la question

Mon code jwtutil.java :

@service
@requiredargsconstructor
public class jwtutil {



    private secretkey getsigningkey() {
        return jwts.sig.hs512.key().build();
    }

    public string generatetoken(securitymember securitymember) {
        map<string, object> claims = new hashmap<>();
        return createtoken(claims, securitymember.getusername());
    }

    public string createtoken(map<string, object> claims, string subject) {
        return jwts.builder().claims(claims).subject(subject).issuedat(new date(system.currenttimemillis()))
                .expiration(new date(system.currenttimemillis() + 1000 * 60 * 60 * 10))
                .signwith(getsigningkey())
                .compact();
    }

    public boolean validatetoken(string token, securitymember securitymember) {
        final string username = extractusername(token);
        return (username.equals(securitymember.getusername()) && !istokenexpired(token));
    }

    private boolean istokenexpired(string token) {
        return extractexpiration(token).before(new date(system.currenttimemillis()));
    }

    public date extractexpiration(string token) {
        return extractclaims(token,claims::getexpiration);
    }

    public
    string extractusername(string token) {
        return extractclaims(token,claims::getsubject);
    }


    private <t> t extractclaims(string token, function<claims, t> claimsresolver) {
        final jwe<claims> claims = extractallclaims(token);
        return claimsresolver.apply(claims.getpayload());
    }

    private jwe<claims> extractallclaims(string token) {
        try {
            return jwts.parser()
                            .requireissuer("http://localhost:8080")
                            .verifywith(getsigningkey())
                            .build()
                            .parse(token).accept(jwe.claims);
        } catch (jwtexception ex) {
            throw new jwtexception("wrong jwt"+ex.getmessage(),ex);
        }


    }
}

La question est :

Caused by: io.jsonwebtoken.security.SignatureException: JWT signature does not match locally computed signature. JWT validity cannot be asserted and should not be trusted.

Workaround

Votre fonction getsigningkey() 使用 jwts.sig.hs512.key().build();, qui créera une nouvelle clé à chaque fois que vous l'appellerez.

Mais vous appelez getsigningkey() lorsque vous signez le token et lorsque vous vérifiez le token, vous avez donc des clés différentes dans les deux cas.

Créez plutôt une clé, stockez-la et utilisez la clé stockée. Par exemple :

signingKey = getSigningKey();

// use it for signing
Jwts.builder().signWith(signingKey)...

// and verification
Jwts.parser().verifyWith(signingKey)...

Mais la création de la clé ne doit pas avoir lieu à chaque fois qu'un jeton est créé, mais doit en être distincte. Vous devez également envisager de conserver la clé afin de conserver la même clé après le redémarrage du programme. Sinon, tous les jetons émis deviendront invalides après le redémarrage.

La vérification signifie que vous vérifiez la signature du jeton par rapport à la même clé utilisée pour la signer.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer