使用智能卡签名 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 设备(专用硬件加速器和设备)在几分之一秒内执行签名。
我无法从您的代码中识别出散列发生的位置。如果卡哈希,需要传输的数据量肯定是瓶颈。考虑在主机端散列。仅在卡上执行签名操作应该在亚秒范围内。
我正在从事一个使用数字签名的项目,无论是物理的还是非物理的(智能卡或文件)。 每个文件需要签名一百个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 设备(专用硬件加速器和设备)在几分之一秒内执行签名。
我无法从您的代码中识别出散列发生的位置。如果卡哈希,需要传输的数据量肯定是瓶颈。考虑在主机端散列。仅在卡上执行签名操作应该在亚秒范围内。