【问题标题】:Signature verification failed vert.x签名验证失败 vert.x
【发布时间】:2017-11-28 16:56:34
【问题描述】:

我正在尝试将 JWT 身份验证添加到我的 vert.x 应用程序中,这就是我目前所做的:
使用以下命令生成密钥库:

keytool -genseckey -keystore keystore.jceks -storetype jceks -storepass secret -keyalg HMacSHA256 -keysize 2048 -alias HS256 -keypass secret

推荐here.
然后在我的 start 方法中,我初始化了 JWTAuth 实例:

jwt = JWTAuth.create(vertx, new JsonObject()
                    .put("keyStore", new JsonObject()
                    .put("type", "jceks")
                    .put("path", "keystore.jceks")
                    .put("password", "secret")));

并为 api 路由添加了处理程序:

router.route("/api/create_room")
            .blockingHandler(JWTAuthHandler.create(jwt));

现在,当我在 Authorization 标头中发送带有一些 Bearer 令牌的请求时,我得到:

WARNING: JWT decode failure
java.lang.RuntimeException: Signature verification failed

我已经测试了令牌here,它说签名验证正确。
我做错什么了吗 ?还是 vert.x 库中的错误?

UPD

private static final String DEFAULT_ALGORITHM = "HMACSHA256";
@Override
  public synchronized byte[] sign(byte[] payload) {
    SecretKey sk = new SecretKeySpec("secret".getBytes(), DEFAULT_ALGORITHM);
    try {
        mac.init(sk);
        return mac.doFinal(payload);
    } catch (GeneralSecurityException e) {
        throw new RuntimeException(e);
    }

  }

显然,我添加了 sk 用于测试目的。我猜cryptoMap初始化时有问题。

【问题讨论】:

    标签: java jwt vert.x


    【解决方案1】:

    您看到的错误意味着根据site you linked 对令牌的解析是正确的,但是签名与令牌的内容不匹配。

    您正在使用自定义签名初始化 JWT,因此您只能验证您自己颁发的令牌。你们是如何发行代币的?

    换句话说,使用此模式只能验证您自己创建的令牌。

    【讨论】:

    • 令牌是使用 spring-security-jwt 创建的。该过程基本上以Signer signer = new MacSigner(secret); Jwt jwt = JwtHelper.encode(content, signer);结束,但我知道其中的秘密,这基本上意味着我可以解码令牌。我已经仔细检查并确保在令牌签名过程中使用的秘密与在 vert.x 应用程序中检查签名时使用的秘密相同。
    • mac 没有被初始化,当我修改Crypto 类中的sign 方法时,在签名验证返回true 之前添加mac.init(sk);。我不太擅长那些加密的东西,你能验证我的建议吗?
    • sk 变量是什么?你能分享你修改过的代码吗?
    • 替换私钥的目的是什么?
    • 为了解决您的问题,我们需要密钥库文件 + 无法解码的令牌,因为一切似乎都是正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-28
    • 2020-11-02
    • 2016-01-13
    • 2011-07-09
    • 1970-01-01
    相关资源
    最近更新 更多