当前位置: 首页 > 知识库问答 >
问题:

如何使用java.security验证xmldsig签名

长孙翔
2023-03-14

我需要使用java.security包使用信封的xml-dsig签名来验证文档。加载后,我取消了元帅文档,并根据xsd具有签名对象 - http://www.w3.org/2000/09/xmldsig#

然后:

@Service
public class XmlSignatureCheckerImpl implements XmlSignatureChecker {
    private static final String ENCRYPTION_ALGORITHM = "RSA";

    private static final String HASH_ENCRYPTION_ALGORITHM = "SHA1withRSA";

    @Override
    @Nullable
    public PublicKey getPublicKey(byte[] exp, byte[] mod) {
        BigInteger modulus = new BigInteger(1, mod);
        BigInteger exponent = new BigInteger(1, exp);
        RSAPublicKeySpec rsaPubKey = new RSAPublicKeySpec(modulus, exponent);

        KeyFactory fact;
        try {
            fact = KeyFactory.getInstance(ENCRYPTION_ALGORITHM);
            return fact.generatePublic(rsaPubKey);
        } catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    @Nullable
    public Boolean verify(byte[] message, byte[] signature, PublicKey publicKey) {
        final Signature sig;
        try {
            sig = Signature.getInstance(HASH_ENCRYPTION_ALGORITHM);
            sig.initVerify(publicKey);
            sig.update(message);
            boolean verify = sig.verify(Base64.encodeBase64Chunked(signature));
            return verify;
        } catch (NoSuchAlgorithmException | SignatureException | InvalidKeyException e) {
            e.printStackTrace();
        }
        return null;
    }
}

调用getPublicKey并验证,结果我得到了签名长度不匹配,如果我没有编码签名,我没有得到不匹配,但也验证是错误的,但我使用的测试数据是完全有效的。放弃寻找错误,帮助我。请。文件编码是UFT-8。

共有1个答案

百里智勇
2023-03-14

你看过官方文件吗?似乎使用签名工厂更方便一些

另外,我已经找到了这些例子,如果它会有所帮助 https://www.java-tips.org/java-ee-tips-100042/158-xml-digital-signature-api/1473-using-the-java-xml-digital-signature-api.html

 类似资料:
  • 有没有可能创建jaxb编组器,它可以自动将数字签名添加到xml内容中。 例如,如果我有一个定义为: 我的xml由marshaller生成,看起来像: 我希望它看起来像: 我希望有办法通过马歇尔做到这一点?如果没有,也许还有其他简单的方法来签署xml? 提前致谢

  • 我们为RSA签名创建了调试公钥和私钥,并生成sha256哈希并保存在cp1.bin中。然后我们尝试验证签名,但总是失败。如果我们不使用pss填充,验证命令将通过。任何人都可以帮忙评论吗? 谢谢 C:\Project\pkc C:\Project\pkc

  • 我有一个由keyCloack生成的JWT,RS256,类似这样的东西 样本: 我需要使用KeyClock证书解码和验证此令牌。 我可以通过api获得KeyClock证书。 在响应中,我有x5c字段。 我可以验证这个jwthttps://jwt.io/如果我把x5c部件放在----证书----标签内 如何在Java中验证同样的事情? 我尝试了几件事,但都失败了。

  • 我的理解是公钥加密,私钥解密...有谁能帮我弄明白吗?

  • 问题内容: 我有一个外部服务,在定义的事件发生后会给我回电,并用其私钥签署他的请求。 我已经存储了如下公钥: 因此,我的工作是通过验证签名来检查请求的内容是否未更改。 这是我的算法: 但是目前,我的算法已停止在此消息的“ PublicKey publicKey = keyFactory.generatePublic(publicKeySpec)”步骤处: 那么,如何以java api接受的方式加载