首頁  >  文章  >  陷入錯誤。 JWT 有效性無法斷言,不應被信任

陷入錯誤。 JWT 有效性無法斷言,不應被信任

王林
王林轉載
2024-02-15 09:18:071187瀏覽

php小編香蕉指出,使用JWT(JSON Web Tokens)時必須注意其有效性無法斷言,不應被信任。 JWT是一種用於身份驗證和授權的令牌,但由於其自包含的特性,一旦令牌被篡改,就無法確保其有效性。因此,在使用JWT時,我們應該採取嚴格的驗證措施,包括驗證簽名、過期時間等,並且不要將敏感資訊儲存在JWT中,以免造成安全風險。

問題內容

我的 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);
        }


    }
}

問題是:

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

解決方法

您的函數getsigningkey() 使用jwts.sig.hs512.key().build();,每次調用它時都會建立一個新密鑰。

但是當您簽署令牌和驗證令牌時,您會呼叫 getsigningkey() ,因此在這兩種情況下您都有不同的金鑰。

而是建立一個金鑰並儲存它並使用儲存的金鑰。例如:

signingKey = getSigningKey();

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

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

但是金鑰的建立不應該在每次建立令牌時都發生,而應該與之分離。您還應該考慮保留密鑰,以便在重新啟動程式後仍然擁有相同的密鑰。否則重啟後所有發行的token都會失效。

驗證表示您根據用於簽署的相同金鑰來驗證令牌簽章。

以上是陷入錯誤。 JWT 有效性無法斷言,不應被信任的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除