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

