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
相关产品推荐
相关产品推荐

