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

用java创建带有编码私钥的rsa256 jwt

习和通
2023-03-14

我正在尝试为下面的行API创建一个访问令牌,这是我的私钥
{
"alg":"RS256",
"d":"TC4Ij...... wqSQIQ",
"dp":"nJg12KiRo... nc02GdK-d8",
"dq":"UzRtJ...... HA70",
"e":"AQAB",
"ext": true,
"key_ops":[
"符号"
],
"kty":"RSA",
"n":"rj_fXZ...... kuNDvOOHimw",
"p":"70k5HA_wTnmAEm...... z4pG79DZ5U",
"qi":"7j7gzQq...... NfS

我想使用下面的代码通过带有有效负载和标头的密钥创建一个令牌

String token = null;
        byte[] privateKey = ResourceUtil.readStr("line_key/privatekey-dev.json", StandardCharsets.UTF_8).getBytes();
        // ペイロードの設定
        Map<String, Object> payloadClaims = new HashMap<>();
        // line channel id
        payloadClaims.put("iss", "XXXXXXX");
        payloadClaims.put("sub", "XXXXXXX");
        payloadClaims.put("aud", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
        payloadClaims.put("exp", new Date(System.currentTimeMillis() + 60 * 30));
        payloadClaims.put("token_exp", 60 * 60 * 24 * 30);
        try {
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            PKCS8EncodedKeySpec privSpec = new PKCS8EncodedKeySpec(privateKey);
            RSAPrivateKey privKey = (RSAPrivateKey) keyFactory.generatePrivate(privSpec);
            //Algorithm algorithm = Algorithm.RSA256(null, privKey);
            token = Jwts.builder()
                    .setHeaderParam("typ", "JWT")
                    .setHeaderParam("alg", "RS256")
                    .setHeaderParam("kid", "XXXXXXX").setClaims(payloadClaims)
                    .signWith(SignatureAlgorithm.RS256, privKey) 
                    .compact();
        } catch (Exception e) {
            log.error(e.getMessage());
        }

由于私有数据没有编码,所以我没有使用Base64对其进行解码<但是它总是显示java。安全spec.InvalidKeySpecException:java。安全InvalidKeyException:密钥格式无效,即使我使用Base64解码从json文件读取的私钥,它也不起作用。

byte[] keyContentAsBytes = Base64.getMimeDecoder().decode(privateKey);

有谁能告诉我如何解决这个问题吗<谢谢

PS:jwt可以通过python生成

key = RSAAlgorithm.from_jwk(privateKey)
JWT = jwt.encode(payload, key, algorithm="RS256", headers=headers, json_encoder=None)

共有1个答案

吉嘉珍
2023-03-14

首先,由于您正在重新发明日期算术轮,您的令牌的有效期仅为1.8秒。我怀疑这是你的本意。使用java的高级API。时间取代了java中的幻数和过时的类型。util,以便您的代码清楚地说明意图。

您没有PKCS#8编码的密钥规范,因此无法使用PKCS8EncodedKeySpec。出于某种原因,我无法理解,JWK忽略了PKCS#8等现有标准,并发明了一种新的格式,采用了臃肿但仍然不透明的JSON编码。

如果确实需要自己转换私钥,可以从JWK中获取参数,并创建一个RSAPrivateCrtKeySpec。我说“真的”,因为如果您使用的库没有从JWK表示加载私钥的方法,我会感到惊讶。

这里是JWK RSA私钥成员和Java的RSAPrivateCrtKeySpec属性之间的映射。

 类似资料:
  • 我有一个加密的私钥,我知道密码。 我需要用Java库解密它。 不过,我不想使用BouncyCastle,除非没有其他选择。根据之前的经验,变更太多,文档不足。 私钥的格式如下: 我相信密钥数据是Base64编码的,因为我在64个字符后看到。 我尝试了以下方法来解密密钥: 我得到这个例外 我是否将正确的参数传递给构造函数? 我怎样才能做到这一点? 我尝试了Ericsonn的建议,有一个小的变化,因为

  • 问题内容: 我有一个加密的私钥,并且知道密码。 我需要使用Java库对其进行解密。 不过,我宁愿不要使用BouncyCastle,除非没有其他选择。根据以前的经验,有太多更改,没有足够的文档。 私钥的格式如下: 我相信关键数据是Base64编码的,因为我看到的是64个字符。 我尝试了以下解密密钥: 我得到这个例外 我是否将正确的参数传递给构造函数? 我该如何工作? 我尝试了Ericsonn的建议,

  • 根据给定的私钥生成密钥对,并在保存后返回其ID。 调用: web3.shh.addPrivateKey(privateKey, [callback]) 参数: privateKey:String - 要导入的私钥,16进制字符串 callback:Function - 可选的回调函数,其第一个参数为错误对象,第二个对象为返回结果 返回值: String - 成功时返回ID,失败则返回错误信息 示

  • 我已经用java代码生成了一个私钥,并将其保存为: 无法加载私钥9964:error:0d0680a8:asn1编码例程:asn1_check_tlen:错误标记:.\crypto\asn1\tasn_dec。c:1319:9964:error:0d06c03a:asn1编码例程:asn1_d2i_ex_primitial:nested asn1错误或:.\crypto\asn1\tasn_dec

  • 我是新到cryptopp,并一直在努力为ECDSA签名创建私钥。 我有一个十六进制编码的私有指数。这存储为字符串。 我想用它来使用ECDSA签署文本块。我的代码看起来有点像这样 此代码在 Visual Studio 中生成以下错误,当我尝试执行 privateKey.load(...) 我猜我正在做一些有点愚蠢的事情...任何帮助都会很棒??? PS我在GMAC一代中使用ECDH时遇到了类似的问题

  • Auth0提供了两个JWT库,一个用于Node:Node jsonwebtoken,另一个用于Java:Java JWT。 我创建了私有/公钥对,并在Node中成功地使用了node-jsonwebToken: 但是我发现没有办法在java-jwtJava做同样的事情。 有人有一个如何在Java中为JWT使用私钥/公钥的工作示例吗?