【问题标题】:io.jsonwebtoken.security.weakkeyexception: The verification key's size is 48 bits which is not secure enough for the HS256 algorithmio.jsonwebtoken.security.weakkeyexception:验证密钥的大小为 48 位,对于 HS256 算法来说不够安全
【发布时间】:2019-08-27 23:33:09
【问题描述】:

我正在尝试从我的 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());
    }

【问题讨论】:

  • 你有什么不明白的?您的“秘密”长度为 48 位,图书馆对此表示不满。
  • 您几乎发布链接的 GitHub 问题似乎不相关。
  • 我认为这是 jjwt 和 base 64 的问题,因为我之前返回的错误也涉及位,所以我掩盖了这个错误。感谢您的帮助

标签: java android base64 jwt token


【解决方案1】:

验证密钥大小为 48 位

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

JSON Web Algorithms中所述

JSON Web 算法 RFC 7518 声明与 哈希输出(例如,“HS256”的 256 位)或更大必须是 与 HS256 算法一起使用。

所以改变你的密钥大小就可以了

【讨论】:

  • 哦.. 嗯,这是有道理的.. 我想我第一次阅读它时并没有理解错误,但现在我看到了我的突出错误。谢谢
【解决方案2】:

出于测试目的,如果想法是生成 256 位作为秘密进行测试,那么这样的方法可以提供帮助:

private String generateSafeToken() {
    SecureRandom random = new SecureRandom();
    byte[] bytes = new byte[36]; // 36 bytes * 8 = 288 bits, a little bit more than
                                 // the 256 required bits 
    random.nextBytes(bytes);
    var encoder = Base64.getUrlEncoder().withoutPadding();
    return encoder.encodeToString(bytes);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-04
    • 2019-02-12
    • 1970-01-01
    • 2020-03-03
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多