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

Android Studio使用p256公钥验证ECDSA签名始终返回false求助

Android P256 ECDSA签名验证失败修复方案

根因定位

你当前验证失败的核心原因是哈希算法不匹配:

  • Android端代码使用的SHA256withECDSA属于SHA2系列哈希算法,会自动对输入的原始消息做SHA2-256哈希运算后再做验签
  • Node.js端签名时使用的是SHA3-256哈希算法对原始业务数据做运算,二者哈希结果完全不同,导致验签始终不通过

修复方案

首先确保你引入的BouncyCastle依赖版本支持SHA3算法,推荐使用较新的bcprov-jdk15on版本,可选择以下任意一种方案修改代码:

方案1:提前计算SHA3-256哈希后验签

// 新增SHA3-256哈希计算方法
public static byte[] calcSha3256(byte[] input) {
    SHA3Digest digest = new SHA3Digest(256);
    digest.update(input, 0, input.length);
    byte[] hash = new byte[digest.getDigestSize()];
    digest.doFinal(hash, 0);
    return hash;
}

// 修改验签方法
private static boolean isValidSignature(byte[] pubKey, byte[] message,byte[] signature) throws Exception {
    // 先对原始消息做SHA3-256哈希
    byte[] msgHash = calcSha3256(message);
    // 使用NONEwithECDSA,不会再自动做哈希运算
    Signature ecdsaVerify = Signature.getInstance("NONEwithECDSA", new BouncyCastleProvider());
    ecdsaVerify.initVerify(getPublicKeyFromBytes(pubKey));
    ecdsaVerify.update(msgHash);
    return ecdsaVerify.verify(signature);
}

方案2:直接使用支持SHA3-256的ECDSA算法

如果你的BouncyCastle版本支持SHA3-256withECDSA算法,可直接修改验签逻辑,无需提前计算哈希:

private static boolean isValidSignature(byte[] pubKey, byte[] message,byte[] signature) throws Exception {
    Signature ecdsaVerify = Signature.getInstance("SHA3-256withECDSA", new BouncyCastleProvider());
    ecdsaVerify.initVerify(getPublicKeyFromBytes(pubKey));
    ecdsaVerify.update(message);
    return ecdsaVerify.verify(signature);
}

内容的提问来源于stack exchange,提问作者syahril idris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 11:18:04