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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:58:05