ホームページ  >  記事  >  エラーが発生しました。 JWT の有効性を主張できないため、信頼すべきではありません

エラーが発生しました。 JWT の有効性を主張できないため、信頼すべきではありません

王林
王林転載
2024-02-15 09:18:071127ブラウズ

php エディターの Banana さんは、JWT (JSON Web Token) を使用する場合、その有効性を主張できず、信頼すべきではないことに注意する必要があると指摘しました。 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);
        }


    }
}

Solution

関数 getsigningkey()jwts.sig.hs512.key().build(); を使用し、それぞれ新しいキーは呼び出されるたびに作成されます。

ただし、トークンに署名してトークンを検証するときは、getsigningkey() を呼び出すため、両方の場合で異なるキーが得られます。

代わりに、キーを作成して保存し、保存されたキーを使用します。例えば:### リーリー

ただし、キーの作成はトークンが作成されるたびに行われるのではなく、トークンとは切り離される必要があります。プログラムを再起動した後も同じキーを使用できるように、キーを保持することも検討する必要があります。そうしないと、再起動後に発行されたすべてのトークンが無効になります。

検証とは、トークンの署名を署名に使用したのと同じ鍵に対して検証することを意味します。

以上がエラーが発生しました。 JWT の有効性を主張できないため、信頼すべきではありませんの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。