Scala中SHA1withECDSA签名验证失败,请求技术帮助
解决ECDSA签名验证始终返回false的问题
我帮你排查下这个问题,最可能的原因是你重复复用了同一个Signature实例!
Signature类是有状态的,当你调用initSign之后,它内部就绑定了当前私钥的状态,后续如果再用这个实例去做验证或者再次签名,内部状态会混乱,直接导致验证失败。看你提供的代码片段,signatureInstance是全局定义的,每次调用sign都会复用它,这绝对是踩坑了。
修正后的代码示例
把Signature实例的创建放到方法内部,每次签名/验证都生成新的实例:
val signatureECDSA = "SHA1withECDSA" def sign(text: String, privateKey: PrivateKey): Array[Byte] = { // 每次签名都创建新的Signature实例,指定SunEC提供者 val signatureInstance = Signature.getInstance(signatureECDSA, "SunEC") signatureInstance.initSign(privateKey) signatureInstance.update(text.getBytes("UTF-8")) signatureInstance.sign() } def verify(text: String, publicKey: PublicKey, signature: Array[Byte]): Boolean = { // 验证同理,也要用新的实例 val signatureInstance = Signature.getInstance(signatureECDSA, "SunEC") signatureInstance.initVerify(publicKey) signatureInstance.update(text.getBytes("UTF-8")) signatureInstance.verify(signature) }
额外排查点
如果修正后还是不行,再检查这几个地方:
- 确认公私钥对匹配:签名用的私钥和验证用的公钥必须是同一密钥对生成的,别不小心用了其他密钥对。
- 字符编码统一:签名和验证时都要明确用
UTF-8编码,别省略"UTF-8"参数用系统默认编码(不同环境默认编码可能不一样)。 - 签名值未被篡改:如果签名字节数组经过了字符串转换(比如Base64),要确保编码/解码过程没有错误,避免字节数组失真。
内容的提问来源于stack exchange,提问作者deraemon
相关产品推荐
相关产品推荐

