Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline yanys  
#1 Оставлено : 29 апреля 2015 г. 13:08:13(UTC)
yanys

Статус: Новичок

Группы: Участники
Зарегистрирован: 29.04.2015(UTC)
Сообщений: 2
Российская Федерация

Здравствуйте!
Периодически наблюдаю NullPointerException при генерации ЭЦП GOST3411withGOST3410EL на JCP 1.0.53:

Код:
java.lang.NullPointerException
        at ru.CryptoPro.JCP.Sign.b.engineUpdate(Unknown Source)
        at java.security.Signature.update(Signature.java:715)
        at java.security.Signature.update(Signature.java:698)


Код подписывания обычный, вида
Код:

KeyStore hdImageStore;
hdImageStore = KeyStore.getInstance("HDImageStore");
hdImageStore.load(null, null);
PrivateKey key = (PrivateKey) hdImageStore.getKey(keyName, keyPassword);
Signature signature = Signature.getInstance("GOST3411withGOST3410EL");
signature.initSign(key);
byte[] textBytes = ...
signature.update(textBytes);
byte[] result = signature.sign();

Подскажите, что это может быть?
Offline Евгений Афанасьев  
#2 Оставлено : 29 апреля 2015 г. 14:17:42(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 4,003
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
Здравствуйте.
Выведите
Код:

System.out.println(key);

key существует?

Offline yanys  
#3 Оставлено : 13 мая 2015 г. 12:52:34(UTC)
yanys

Статус: Новичок

Группы: Участники
Зарегистрирован: 29.04.2015(UTC)
Сообщений: 2
Российская Федерация

Здравствуйте.
Да, key существовал в момент создания/инициализации объекта Signature.
Я несколько упростил код, мы кэшируем проинициализированные объекты Signature и многократно используем их из разных потоков для выполнения пары операций update/sign. Вот так:
Код:

            Signature signature = SIGNATURE_CACHE.get(keyName, new Callable<Signature>() {
                @Override
                public Signature call() throws Exception {
                    return load();
                }
            });            
            signature.update(textBytes);
            byte[] result = signature.sign();
						

Метод load вызывается однократно, при инициализации кэша и тело его выглядит так:
Код:

            KeyStore hdImageStore = KeyStore.getInstance("HDImageStore");
            hdImageStore.load(null, null);
            final PrivateKey key = (PrivateKey) hdImageStore.getKey(keyName, null);
            if (key == null) {
                throw new NullPointerException("Failed to load key " + keyName + " !");
            }
            Signature signature = Signature.getInstance("GOST3411withGOST3410EL");
            signature.initSign(key);
						

Это работает почти всегда, но редко бывает так, что signature.update() начинает выбрасывать NPE при каждом вызове, как будто какое-то внутреннее состояние портится.

Можно ли вообще кешировать объекты Signature или нужно всегда их пересоздавать?

Отредактировано пользователем 13 мая 2015 г. 12:53:35(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#4 Оставлено : 13 мая 2015 г. 13:05:32(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 4,003
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
Здраствуйте.
По 1.0.53 сложно сказать. Попробуйте:
1) выполнять еще initSign() перед update;
2) JCP 1.0.54 или 2.0.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.