Rumah > Java > Jatuh dalam kesilapan. Kesahan JWT tidak boleh ditegaskan dan tidak boleh dipercayai

Jatuh dalam kesilapan. Kesahan JWT tidak boleh ditegaskan dan tidak boleh dipercayai

王林
Lepaskan: 2024-02-15 09:18:07
ke hadapan
1229 orang telah melayarinya

editor php Banana menegaskan bahawa apabila menggunakan JWT (Token Web JSON), anda mesti ambil perhatian bahawa kesahihannya tidak boleh ditegaskan dan tidak boleh dipercayai. JWT ialah token yang digunakan untuk pengesahan dan kebenaran, tetapi disebabkan sifatnya yang serba lengkap, apabila token itu diganggu, kesahihannya tidak dapat dijamin. Oleh itu, apabila menggunakan JWT, kita harus mengambil langkah pengesahan yang ketat, termasuk mengesahkan tandatangan, masa tamat tempoh, dsb., dan tidak menyimpan maklumat sensitif dalam JWT untuk mengelakkan risiko keselamatan.

Kandungan soalan

Kod jwtutil.java saya:

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


    }
}
Salin selepas log masuk

Soalannya ialah:

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

Penyelesaian

Fungsi anda getsigningkey() 使用 jwts.sig.hs512.key().build();, yang akan mencipta kunci baharu setiap kali anda memanggilnya.

Tetapi anda menelefon getsigningkey() apabila anda menandatangani token dan apabila anda mengesahkan token, jadi anda mempunyai kunci yang berbeza dalam kedua-dua kes.

Sebaliknya buat kunci dan simpan dan gunakan kunci yang disimpan. Contohnya:

signingKey = getSigningKey();

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

// and verification
Jwts.parser().verifyWith(signingKey)...
Salin selepas log masuk

Tetapi penciptaan kunci tidak sepatutnya berlaku setiap kali token dicipta, tetapi harus berasingan daripadanya. Anda juga harus mempertimbangkan untuk mengekalkan kunci supaya anda masih mempunyai kunci yang sama selepas memulakan semula program. Jika tidak, semua token yang dikeluarkan akan menjadi tidak sah selepas dimulakan semula.

Pengesahan bermakna anda mengesahkan tandatangan token terhadap kunci yang sama yang digunakan untuk menandatanganinya.

Atas ialah kandungan terperinci Jatuh dalam kesilapan. Kesahan JWT tidak boleh ditegaskan dan tidak boleh dipercayai. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan