io.jsonwebtoken.security.weakkeyexception:验证密钥的大小为 48 位,对于 HS256 算法来说不够安全

anc*_*ea4 6 java base64 android token jwt

我试图从我的 Web 应用程序的 api 中获取一个令牌,并在 android studio 中从中解析出用户 ID。我正在使用 jjwt 解码令牌,但遇到了这个问题。我在网上阅读,解决方案说要确保我的“密钥”在 base 64 中,但它仍然导致问题。

我尝试使用编码器和在线编码器并对我的“秘密”的 base-64 字符串进行硬编码,但仍然返回相同的问题。在这里可以找到指向有类似问题的人的链接 github.com/auth0/node-jsonwebtoken/issues/208

    final TextView tv = (TextView) findViewById(R.id.tvText);

    final String token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjVjOWYzYWI2NzY2Mjg2NDYyNDY0YTczNCIsIm5hbWUiOiJSYW5keSIsImF2YXRhciI6Ii8vd3d3LmdyYXZhdGFyLmNvbS9hdmF0YXIvMTNhN2MyYzdkOGVkNTNkMDc2MzRkOGNlZWVkZjM0NTE_cz0yMDAmcj1wZyZkPW1tIiwiaWF0IjoxNTU0NTIxNjk1LCJleHAiOjE1NTQ1MjUyOTV9._SxRurShXS-SI3SE11z6nme9EoaD29T_DBFr8Qwngkg";
    final String secret = "secret";
    String secret64 = "c2VjcmV0";

    String encoded = Base64.encodeToString(secret.getBytes(), Base64.DEFAULT);

    Jws<Claims> jws;
    try {
        jws = Jwts.parser()         // (1)

                .setSigningKey(secret64)       // (2)
                .parseClaimsJws(token); // (3)

        // we can safely trust the JWT

    }
    catch (JwtException ex) {       // (4)
        // we *cannot* use the JWT as intended by its creator
        tv.setText(ex.toString());
    }
Run Code Online (Sandbox Code Playgroud)

Tej*_*dya 16

验证密钥的大小为 48 位

这句话讲述了整个故事。secret您使用的密钥太短。如果您使用的HS256SHA-256需要至少256 位或更大的HMAC,则必须与HS256算法一起使用。

JSON Web 算法中所述

JSON Web 算法 RFC 7518 规定,与哈希输出大小相同(例如,“HS256”为 256 位)或更大的密钥必须与 HS256 算法一起使用。

所以改变你的密钥大小,你很高兴