You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中直接传入字符串密钥生成Ed25519签名遇空指针问题

解决Ed25519签名生成时PemObject为null的问题

问题原因

PemReader仅能解析标准PEM格式的密钥内容,要求必须包含固定的边界行:

-----BEGIN PRIVATE KEY-----
[Base64编码的密钥内容]
-----END PRIVATE KEY-----

你传入的secret是裸的Base64字符串(如MCow********************fasaIo),缺少PEM格式的头尾标识,导致readPemObject()无法识别有效内容,返回null触发空指针异常。

解决方案

提供两种可行处理方式:

方式1:补全PEM格式头尾

给密钥字符串添加PEM格式的边界行,让PemReader正常解析:

// 补全标准PEM格式
String pemFormattedSecret = "-----BEGIN PRIVATE KEY-----\n" + secret + "\n-----END PRIVATE KEY-----";
PemReader pemReader = new PemReader(new StringReader(pemFormattedSecret));
PemObject pemObject = pemReader.readPemObject();
if (pemObject != null) {
    byte[] privateKeyBytes = pemObject.getContent();
    Ed25519PrivateKeyParameters privateKey = (Ed25519PrivateKeyParameters) PrivateKeyFactory.createKey(privateKeyBytes);
    // 后续签名逻辑与原代码一致
    pemReader.close();
}

方式2:直接解码Base64字符串(更高效)

PEM的核心内容就是Base64编码的密钥,可跳过PemReader直接解码字符串,省去格式解析开销:

// 直接解码Base64密钥字符串
byte[] privateKeyBytes = Base64.getDecoder().decode(secret);
Ed25519PrivateKeyParameters privateKey = (Ed25519PrivateKeyParameters) PrivateKeyFactory.createKey(privateKeyBytes);

// 后续签名逻辑保持不变
byte[] dataBytes = data.getBytes(StandardCharsets.UTF_8);
Ed25519Signer signer = new Ed25519Signer();
signer.init(true, privateKey);
signer.update(dataBytes, 0, dataBytes.length);
byte[] signatureBytes = signer.generateSignature();
return Base64.getEncoder().encodeToString(signatureBytes);

内容的提问来源于stack exchange,提问作者Crypto Deal Bot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 09:25:06