当前位置: 首页 > 知识库问答 >
问题:

使用JWTSigner生成的令牌。sign()表示jwt中的签名无效。io调试器

幸阳波
2023-03-14

我们使用java-jwt编写了小API。当我创建令牌并在代码中验证令牌时,Java正常工作。

  1. 创建RSA私钥和公钥。(参考其中一个测试用例)
  2. 使用算法创建令牌。RS256与私钥。
  3. 验证了相同的令牌,并获得了预期的输出。

然后向客户端提供公钥,我们开始使用生成的令牌调用他们的REST服务。客户端使用https://www.npmjs.com/package/jsonwebtoken来验证令牌。他们回来说令牌和公钥在调试器中提供了无效签名jwt.io。他们要求首先在调试器jwt.io工作。我不明白当它在Java代码中工作时,为什么它在jwt.io.中这样说我错过了什么吗?

public void createPemFiles(String absoluteFilePath) throws Exception {    
  logger.log(Level.INFO, "Received request to create Key pair : " + absoluteFilePath);
  PemWriter pemWriter = new PemWriter();
  // create key pair
  final KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", "BC");
  generator.initialize(KEY_SIZE);
  final KeyPair keyPair = generator.generateKeyPair();

  // write private key
  final RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
  privateKeyPem = new File(absoluteFilePath);
  pemWriter.writePrivateKey(privateKey, "RSA PRIVATE KEY", privateKeyPem.getAbsolutePath());
  logger.log(Level.INFO, "Created private key  : " + privateKeyPem.getAbsolutePath());

  // write public key
  publicKeyPem = new File(absoluteFilePath+".pub");
  final RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
  pemWriter.writePublicKey(publicKey, "RSA PUBLIC KEY", publicKeyPem.getAbsolutePath());
  logger.log(Level.INFO, "Created public key  : " + publicKeyPem.getAbsolutePath());
}
public String createJWTToken(String [] keyValues) {
  final HashMap<String, Object> claims = new HashMap<String, Object>();
  String [] nameValue;

  for(String keyValue : keyValues) {
      nameValue = keyValue.split("##");
      claims.put(nameValue[0],nameValue[1]);
  }
  return JWTSIGNER.sign(claims, OPTIONS);
}
public String verifyJWTToken(String token) throws  Exception{
  logger.log(Level.DEBUG, "Received request for verify JWT token");
  Map<String, Object> claims = JWTVERIFIER.verify(token);
  String claimString = "";

  String key = "";
  String value = "";

  for(Map.Entry<String, Object> entry : claims.entrySet()) {
      key = entry.getKey();
      value = (String) entry.getValue().toString();
      claimString = claimString + key +":"+ value + "##";
  }
  claimString = replaceLast(claimString, "##", "");
  logger.log(Level.DEBUG, "Successfully verified : "+claimString);
  return claimString;
}

输入

iccid:4454788545885968585##
nonce:5e452610c9f9decd:-404fb717:157fd6fc54e:-7ffe##
timestamp:2016-10-25T16:16:36.036Z

已创建令牌输出

eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9。EYJPY2NPZCI6IJQ0NTQ3ODG1NDU4ODU5NJG1ODUILCJub25JZSI6IJVLNDUYJEWYZLMOWNZINZE3OJEN2ZKNMZNZNZNJNTROI03ZMIIWIDGLTZNZN0YW1WIJOIMJAXNI0xMC0YNVQNJOXNI4WMZIN0。4.中国政府对北京市政府的一次采访采访采访采访采访采访采访采访采访采访采访采访采访采访采访采访采访采访采访采访采访采访采访采访了北京市政府对北京市政府的一次采访采访采访采访采访采访采访采访采访了北京市政府对北京市政府的一次采访采访采访采访采访采访采访采访了北京市政府的一次采访采访采访采访采访了北京市政府的一次采访采访采访采访采访采访了北京市政府的一个北京市政府的一个采访采访采访采访采访了一个北京市政府的一个北京市政府的一个北京市政府的一个北京市政府的一个北京市政府的一个北京市政府的一个北京市政府一个7 7 7 7级政府一个7级政府的采访采访采访采访采访采访采访采访采访采访了一个北京市政府,一个北京市一个北京市政府的一个7 7 7 7 7 7 7 7级政府的一个北京市政府的中国中国中国中国中国的一个中国中国中国中国的一个7 7 7 7 7级的oL594fRA2anr-JunSxtpkI8-tKzR9NG5dt4F79Q

验证令牌输出

iccid:4454788545885968585##
nonce:5e452610c9f9decd:-404fb717:157fd6fc54e:-7ffe##
timestamp:2016-10-25T16:16:36.036Z

公钥

-----BEGIN RSA PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx58WGD/wRFnwe64sl/9V
KuNOQChYUy8GfhQU66M2XSnx/UpjPCqhGYRmpUXT+rQAamUDsarGt8Kbw1DtlvLT
p2UTvSWiCJNQzi53CRa6iDbk213Ps7zuAFhuXB7s0ZqdOZbeJnXFFM/wMJbM6kdB
yAdCwj8/kCKCjSt3Q0CLdxaToTucRJuO7/V4wbJIDMfLt3LPlry/PsHQAx0RKXco
TO1JsSGWg99dHBEqpxLMBtZyhyd8++PrMrtQ4pPVAmXoJODKY2NZkiLl3h4Ai48z
FhBNHsWQDTJKA8skb2JQER9i1a1/ip/cgkR6FG6G65DbhrMElcL0mgdst49PF26p
pwIDAQAB
-----END RSA PUBLIC KEY-----

共有1个答案

方高丽
2023-03-14

似乎是jwt。io需要一个公钥文件(PKCS#8):

-----BEGIN PUBLIC KEY-----
BASE64 DATA
-----END PUBLIC KEY-----

您传递的不是RSA公钥文件(PKCS#1),而是:

-----BEGIN RSA PUBLIC KEY-----
BASE64 DATA
-----END RSA PUBLIC KEY-----

有趣的是,如果您手动编辑文件,将RSA PUBLIC KEY标记替换为仅使用PUBLIC KEY标记,那么您将获得经过验证的签名。这很奇怪,因为BASE 64数据会根据格式而不同,但是,我没有研究细节,以找到如果有任何罪魁祸首,所以不要问我为什么,但这将起作用。

 类似资料:
  • 我试图测试我正在构建的一个关于JWT的软件的功能,以了解它,它使用Firebase JWT PHP包 我正在尝试创建一个使用密钥对作为编码/解码的测试用例,但无法获得http://jwt.io页面以使用我的密钥创建令牌。 这些是我使用命令创建的密钥,没有任何修改。 我转到页面,选择HS256/384/512并删除页面默认设置的键。然后我粘贴我的私钥以便对我的数据进行签名。但是,该页面不会生成任何J

  • 我正在使用Azure AD对spring boot应用程序进行用户身份验证。我创建了一个应用程序来获取登录用户的访问令牌(令牌创建者应用程序)。在此应用程序中,“/token”API从@RegisteredAuth2AuthorizedClient读取访问令牌,并返回与响应相同的令牌。 然后,我必须使用返回的令牌作为RESTAPI的承载令牌,用于具有相同客户端id和相同配置的另一个应用程序。 但当

  • 我正在使用谷歌KMS(https://cloud.google.com/kms/)使用非对称签名密钥对节点中的JSON Web令牌(jwt)进行签名。js应用程序。 我能够创建标头和有效载荷,并与谷歌KMS nodejs库(https://github.com/googleapis/nodejs-kms)我可以签署令牌。 但似乎生成的令牌无效。 事实上,我正在执行以下步骤来生成令牌: 将jwt头定

  • 这是一场噩梦。我在使用jwt验证Azure访问令牌签名时遇到问题。木卫一。不管我做什么,答案总是无效的签名。 有人能帮忙吗? 我的步骤: 我从MSALJava应用示例(msal-java-webapp-samp)生成了一个Token Id和Access Token。 我从我的Azure访问令牌中获得访问令牌头中的孩子访问。 我访问

  • 我被这个困扰了大约3天。基本上,我正在尝试使用Tymon在laravel中生成JWT令牌。这是我的控制器文件。 我使用Chrome postman测试了此api,但它报告了以下错误: JWT.php第73行出现错误异常:传递给Tymon\JWTAuth\JWT::fromUser()的参数1必须是第217行上的Tymon\JWTAuth\Contracts\JWTSubject、App\User给

  • 我遵循本教程使用JWT令牌。令牌到期时间设置为仅5分钟,但如果我想在使用1分钟后使令牌无效,该怎么办?我希望能够对API进行调用,以删除我的令牌。 我正在使用Express和Node。 从我能收集到的信息来看,我的选择是拥有一个存储令牌的令牌db。当我想让我的令牌过期时,我会从DB中过期/删除该令牌。 我还看到人们随意地说“移除”物理硬盘空间中的令牌,但我无法找出令牌的物理存储位置,以便我移除它。