使用智能卡签名 xml 花费的时间太长

Sign xml with smart card taking too long

我正在从事一个使用数字签名的项目,无论是物理的还是非物理的(智能卡或文件)。 每个文件需要签名一百个xml代码,现在有2500个文件,所以就是2500 * 100 = 250,000次。使用 a1 证书(文件)时,每个文件需要 2 秒。当我尝试智能卡时,每个文件需要 30 秒,这意味着所有文件将花费将近 21 小时,这太长了。 我想知道是否有人处理过这个问题,顺便说一句,这是 Java 代码,后面是一个片段。

    Element elemento = (Element) document.getElementsByTagName(elementName).item(0);
    elemento.setIdAttribute("id", true);
    String id = elemento.getAttribute("id");

    Init.init();

    ElementProxy.setDefaultPrefix(Constants.SignatureSpecNS, "");
    XMLSignature sig = new XMLSignature(document, "", XMLSignature.ALGO_ID_SIGNATURE_RSA_SHA256);

    elemento.getParentNode().appendChild(sig.getElement());

    {
        Transforms transforms = new Transforms(document);
        transforms.addTransform(Transforms.TRANSFORM_ENVELOPED_SIGNATURE);
        transforms.addTransform(Transforms.TRANSFORM_C14N_OMIT_COMMENTS);
        sig.addDocument("#" + id, transforms, "http://www.w3.org/2001/04/xmlenc#sha256");
    }

    XmlUtils.trimWhitespace(document);
    XmlUtils.scapeChars(document);

    {
        X509Certificate cert = certificadoBean.getCertificate();
        sig.addKeyInfo(cert);
        sig.sign(certificadoBean.getPrivateKey());
    }

虽然30秒对于单次操作来说太长了,但廉价的硬件(智能卡和USB令牌)确实很慢,单次操作通常需要2-3秒。您需要使用更快的硬件设备来完成您的任务。例如,行业级 PKI 设备(专用硬件加速器和设备)在几分之一秒内执行签名。

我无法从您的代码中识别出散列发生的位置。如果卡哈希,需要传输的数据量肯定是瓶颈。考虑在主机端散列。仅在卡上执行签名操作应该在亚秒范围内。