gpt4 book ai didi

Java Bouncy CaSTLe 生成的 ES256 key 不适用于 JWT.io

转载 作者:行者123 更新时间:2023-12-05 02:54:45 25 4
gpt4 key购买 nike

我正在生成如下所示的 key 对:

 public static void main(String args[]) throws Exception{

StringWriter pemStrWriter = new StringWriter();
JcaPEMWriter pemWriter = new JcaPEMWriter(pemStrWriter);


Security.addProvider(new BouncyCastleProvider());
KeyPairGenerator g = KeyPairGenerator.getInstance("ECDSA", "BC");
ECGenParameterSpec spec = new ECGenParameterSpec("secp256r1");
g.initialize(spec);
KeyPair keyPair = g.generateKeyPair();

pemWriter.writeObject(new JcaPKCS8Generator(keyPair.getPrivate(), null));
pemWriter.close();
BufferedWriter writer = new BufferedWriter(new FileWriter("privatekeyjca.pem"));
writer.write(pemStrWriter.toString());
writer.close();

BufferedWriter writer2 = new BufferedWriter(new FileWriter("publickeyjca.pem"));
StringWriter pemStrWriter2 = new StringWriter();
JcaPEMWriter pemWriter2 = new JcaPEMWriter(pemStrWriter2);
pemWriter2.writeObject(keyPair.getPublic());
pemWriter2.close();
writer2.write(pemStrWriter2.toString());
writer2.close();
}

下面是我生成的私钥:

-----BEGIN PRIVATE KEY-----
MIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQgVBnFvRMRyO418Oeb
z1YI778gLVNZJn0YI+atgDhTsPagCgYIKoZIzj0DAQehRANCAAQxzPBfVxJfosNl
3tJc+pD0tpftsEy2hWmLc5EK7QbSAtXqqVL2/Zn6JxMbkueRpvIl1/Ag0NvBbnv+
OJfWY2ws
-----END PRIVATE KEY-----

下面是我生成的公钥:

-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEMczwX1cSX6LDZd7SXPqQ9LaX7bBM
toVpi3ORCu0G0gLV6qlS9v2Z+icTG5LnkabyJdfwINDbwW57/jiX1mNsLA==
-----END PUBLIC KEY-----

当我转到 JWT.io 并尝试生成 JWT 时,我选择了 ES256 算法,并输入了我的私钥,但它没有提供任何信息。但是,如果我使用通过 openssl 命令生成的私钥,它会给我一个 JWT。

你能告诉我使用 Java 生成的 key 有什么问题吗?

最佳答案

无论 jwt.io 使用什么代码都不必要地脆弱。

当将 PKCS8 用于“EC”(X9.62 样式、ECDSA 和/或 ECDH 和/或相关)私钥时,算法相关部分使用由 https://secg.org 的 SEC1 的附录 C.4 定义的结构:

ECPrivateKey ::= SEQUENCE {
version INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1),
privateKey OCTET STRING,
parameters [0] ECDomainParameters {{ SECGCurveNames }} OPTIONAL,
publicKey [1] BIT STRING OPTIONAL
}

如您所见,第三个和第四个元素是可选的。当 OpenSSL 编写此结构时,它省略了第三个元素(参数),因为它与外部 PKCS8 的 AlgorithmIdentifier 是冗余的,但包含第四个元素(publicKey),因为虽然在技术上冗余但它可能很有用。

Java 中的 BouncyCaSTLe 包括两者,而 (Oracle/OpenJDK) 标准提供程序 SunEC 两者都不包括。比较 https://crypto.stackexchange.com/questions/80275/converting-raw-ecc-private-key-into-asn-1-der-encoded-key/#80290 包括我的评论。看起来无论 jwt.io 正在运行什么代码——它没有说,我也没有试图弄清楚——被编码为解析 EC 私钥文件,假设 OpenSSL 仅使用组合而没有其他,因此不会适用于 Bouncy 或 SunEC 格式。

将 SunEC 格式转换为 OpenSSL 需要做一些工作——您需要实际执行 dG 的标量乘法,尽管使用 Bouncy 这并不太难。 OTOH 因为你有 Bouncy,将 Bouncy 格式转换为 OpenSSL,通过简单地省略 SEC1 结构中的参数,是相当容易的:

//nopackage
import java.io.OutputStreamWriter;
import java.security.*;
import java.security.spec.ECGenParameterSpec;

import org.bouncycastle.asn1.ASN1Sequence;
import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
import org.bouncycastle.asn1.sec.ECPrivateKey;
import org.bouncycastle.openssl.PKCS8Generator;
import org.bouncycastle.openssl.jcajce.JcaPEMWriter;
import org.bouncycastle.openssl.jcajce.JcaPKCS8Generator;
import org.bouncycastle.util.io.pem.PemObject;

public class SO61676744ECKeyNoParam {
public static void main (String[] args) throws Exception {
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
JcaPEMWriter wr = new JcaPEMWriter(new OutputStreamWriter(System.out));

KeyPairGenerator gen = KeyPairGenerator.getInstance("EC","BC");
gen.initialize(new ECGenParameterSpec("secp256r1"));
KeyPair key = gen.generateKeyPair();
PrivateKeyInfo badp8 = PrivateKeyInfo.getInstance(key.getPrivate().getEncoded());
ECPrivateKey badsec = ECPrivateKey.getInstance(badp8.parsePrivateKey());
ECPrivateKey goodsec = new ECPrivateKey(256, badsec.getKey(), badsec.getPublicKey(), null);
PrivateKeyInfo goodp8 = new PrivateKeyInfo(badp8.getPrivateKeyAlgorithm(), goodsec);
wr.writeObject(new PemObject("PRIVATE KEY", goodp8.getEncoded()));
wr.writeObject(key.getPublic());

wr.close();
}
}

关于Java Bouncy CaSTLe 生成的 ES256 key 不适用于 JWT.io,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61676744/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com