#308·jsencrypt

Java 应该如何验证您生成的签名

作者: goodtan创建于 2024年3月27日更新于 2025年5月7日

我使用了您的插件在前端开发代码中生成签名并解除签名。但是,在 Java 中,解除签名失败,并且在转换字节数组和 Java 生成的签名前端代码时数据不正确,因此 Java 应该如何调整。 const signWithPrivateKey = (privateKey, data) => { const encrypt = new JSEncrypt(); encrypt.setPrivateKey(privateKey); return encrypt.sign(data, CryptoJS.SHA1); }; // 使用公钥验证签名 const verifyWithPublicKey = (publicKey, data, signature) => { const encrypt = new JSEncrypt(); encrypt.setPublicKey(publicKey); return encrypt.verify(data, signature, CryptoJS.SHA1); }; Java 代码: @Override protected boolean engineVerify(byte[] sigBytes) throws SignatureException { if (publicKey == null) { throw new SignatureException("Missing public key"); } try { if (sigBytes.length != RSACore.getByteLength(publicKey)) { throw new SignatureException("Signature length not correct: got " + sigBytes.length + " but was expecting " + RSACore.getByteLength(publicKey)); } byte[] digest = getDigestValue(); byte[] decrypted = RSACore.rsa(sigBytes, publicKey); byte[] unpadded = padding.unpad(decrypted); byte[] decodedDigest = decodeSignature(digestOID, unpadded); return MessageDigest.isEqual(digest, decodedDigest); } catch (javax.crypto.BadPaddingException e) { // 如果应用程序使用了错误的 RSA 公钥,或者 sigBytes 无效,则发生此错误 // 返回 false 而不是传播异常,以实现兼容性和易用性 return false; } catch (IOException e) { throw new SignatureException("Signature encoding error", e); } finally { resetDigest(); } }

内容来源: travist/jsencrypt