Подписать XML с помощью смарт-карты занимает слишком много времени

Я работаю над проектом, в котором используется цифровая подпись, как физическая, так и нет (смарт-карта или файл). Мне нужно подписать сто кусков 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());
    }

person Leonardo Lana    schedule 24.05.2016    source источник


Ответы (2)


Хотя 30 секунд слишком долго для одной операции, дешевое оборудование (смарт-карты и USB-токены) действительно очень медленное, и одна операция обычно занимает 2-3 секунды. Вам нужно использовать более быстрое аппаратное устройство для вашей задачи. Например, отраслевые устройства PKI (специализированные аппаратные ускорители и устройства) выполняют подпись за доли секунды.

person Eugene Mayevski 'Callback    schedule 24.05.2016
comment
Большое спасибо, Евгений, я пробовал параллельное выполнение, оно увеличилось на 2 секунды за выполнение. Ты не думаешь, что я мог бы попытаться улучшить хотя бы еще несколько секунд? - person Leonardo Lana; 24.05.2016
comment
@LanaStf Я бы постарался убедиться, что это аппаратное обеспечение, которое увеличивает медлительность. Если вы можете использовать то же оборудование в любой другой операции подписи, кроме кода подписи Java, было бы здорово протестировать оборудование. Возможно, поставщик оборудования предлагает приложение или есть какой-то другой неуправляемый (не Java) способ протестировать ваше устройство. - person Eugene Mayevski 'Callback; 24.05.2016
comment
Разве тот факт, что a1 работает в 16 раз быстрее, не гарантирует этого? - person Leonardo Lana; 25.05.2016
comment
@LanaStf сравнение, которое я предлагаю, проводится не между сертификатом, хранящимся на диске, и сертификатом в оборудовании, а между управляемым и неуправляемым кодом. Я бы попытался исключить фактор взаимодействия Java с оборудованием. - person Eugene Mayevski 'Callback; 25.05.2016
comment
@LanaStf У нас была такая же проблема, как у вас. В моем случае задержки связаны с сетью, поэтому мы реализовали потоки, а точнее 5. Приложение подписало 200 000 файлов и сгенерировало соответствующие XML-файлы за 20 часов. До этой реализации процесс занимал около 80 часов. Так что нитки - хороший вариант. - person lumee; 25.05.2016
comment
Прежде всего, благодаря комментарию. Я также сделал это, в моем случае пользователь вводит n файлов, я разбиваю файлы на 4 стека, а затем создаю один поток для каждого квартала, который синхронно запускает свои файлы внутри цикла, поэтому одновременно выполняется 4 выполнения. Но, поскольку файлы должны быть подписаны сто раз каждый, я разбиваю сам файл еще на два потока, по 50 узлов в каждом, поэтому я предполагаю, что есть 4 потока + 8 «подпотоков», но это все еще довольно медленно - person Leonardo Lana; 25.05.2016

Я не могу понять из вашего кода, где происходит хеширование. Если карта хэширует, объем данных, необходимых для передачи, безусловно, является узким местом. Рассмотрим хеширование на стороне хоста. Выполнение только операции подписи на карте должно занять что-то в диапазоне долей секунды.

person guidot    schedule 01.06.2016
comment
Я думал, что это уже будет работать таким образом, внутренне. Может ли смарт-карта переваривать ценность? - person Leonardo Lana; 16.06.2016
comment
@ Некоторые карты поддерживают хеширование, но из-за пропускной способности ввода-вывода это используется редко. - person guidot; 16.06.2016