Heim > Java > Ein Fehler ist aufgetreten. Die JWT-Gültigkeit kann nicht behauptet werden und sollte nicht als vertrauenswürdig eingestuft werden

Ein Fehler ist aufgetreten. Die JWT-Gültigkeit kann nicht behauptet werden und sollte nicht als vertrauenswürdig eingestuft werden

王林
Freigeben: 2024-02-15 09:18:07
nach vorne
1211 Leute haben es durchsucht

php-Redakteur Banana wies darauf hin, dass man bei der Verwendung von JWT (JSON Web Tokens) beachten muss, dass dessen Gültigkeit nicht behauptet werden kann und nicht vertrauenswürdig ist. JWT ist ein Token, der zur Authentifizierung und Autorisierung verwendet wird. Aufgrund seiner eigenständigen Natur kann seine Gültigkeit jedoch nicht garantiert werden, sobald das Token manipuliert wird. Daher sollten wir bei der Verwendung von JWT strenge Überprüfungsmaßnahmen ergreifen, einschließlich der Überprüfung von Signaturen, Ablaufzeit usw., und keine vertraulichen Informationen in JWT speichern, um Sicherheitsrisiken zu vermeiden.

Frageninhalt

Mein jwtutil.java-Code:

@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);
        }


    }
}
Nach dem Login kopieren

Die Frage ist:

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

Workaround

Ihre Funktion getsigningkey() 使用 jwts.sig.hs512.key().build();, die bei jedem Aufruf einen neuen Schlüssel erstellt.

Aber Sie rufen getsigningkey() an, wenn Sie den Token signieren und wenn Sie den Token verifizieren, sodass Sie in beiden Fällen unterschiedliche Schlüssel haben.

Erstellen Sie stattdessen einen Schlüssel, speichern Sie ihn und verwenden Sie den gespeicherten Schlüssel. Zum Beispiel:

signingKey = getSigningKey();

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

// and verification
Jwts.parser().verifyWith(signingKey)...
Nach dem Login kopieren

Aber die Erstellung des Schlüssels sollte nicht bei jeder Token-Erstellung erfolgen, sondern getrennt davon erfolgen. Sie sollten auch darüber nachdenken, den Schlüssel aufzubewahren, damit Sie nach einem Neustart des Programms immer noch über denselben Schlüssel verfügen. Andernfalls werden alle ausgegebenen Token nach dem Neustart ungültig.

Verifizierung bedeutet, dass Sie die Token-Signatur anhand desselben Schlüssels überprüfen, der zum Signieren verwendet wurde.

Das obige ist der detaillierte Inhalt vonEin Fehler ist aufgetreten. Die JWT-Gültigkeit kann nicht behauptet werden und sollte nicht als vertrauenswürdig eingestuft werden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage