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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline Алексей Черенцов  
#1 Оставлено : 27 января 2020 г. 7:33:06(UTC)
Алексей Черенцов

Статус: Активный участник

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

Сказал(а) «Спасибо»: 14 раз
Приветствую!

В нашем проекте существует генерация и проверка HMAC на основе Java CSP. Недавнвно возникла задача перевести алгоритм на JCP. Написал код в соответствии с документацией "ЖТЯИ.00091-03 33 02-01. Руководство программиста (модули шифрования).pdf":

Код:

//String dataBase64 = некие данные
KeyGenerator kg = KeyGenerator.getInstance(CryptoProvider.SYMMETRIC_512, CryptoProvider.PROVIDER_NAME);
kg.init(null);
SecretKey key = kg.generateKey();
final Mac mac = Mac.getInstance(GostHMAC2012_512.STR_NAME, CryptoProvider.PROVIDER_NAME);
mac.init(key);
mac.update(dataBase64.getBytes(), 0, dataBase64.getBytes().length);
byte[] result = mac.doFinal();


Вопросы:
1) В строке kg.init(null); среда разработки указывает на ошибку, так как kg.init требует не null, а SecureRandom или AlgorithmParameterSpec.
2) Правильно ли в целом написан код?

Отредактировано пользователем 27 января 2020 г. 9:57:49(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#2 Оставлено : 27 января 2020 г. 11:38:47(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 22 раз
Поблагодарили: 751 раз в 708 постах
Добрый день.
Возможно, когда писалась документация (N лет назад), в классе KeyGenerator еще не было двух функций, принимающих по одному аргументу. Попробуйте, например, указать так:
Код:

kg.init((SecureRandom)null);

Спасибо, исправим в документации.
Offline Алексей Черенцов  
#3 Оставлено : 27 января 2020 г. 12:45:56(UTC)
Алексей Черенцов

Статус: Активный участник

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

Сказал(а) «Спасибо»: 14 раз
Ха, изначально я так и сделал. Но у меня возникли подозрения, что при этом сформировался пустой ключ. Сдалал я это предположение на основании того, что:

key.getEncoded() == null

При этом в алгоритме реализованном на Java CSP:

key.getEncoded() != null

То есть вопрос заключается сейчас в следующем, как определить, что ключ сформировался корректно? Нормально ли, что key.getEncoded() == null.
Offline Евгений Афанасьев  
#4 Оставлено : 27 января 2020 г. 13:02:31(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 22 раз
Поблагодарили: 751 раз в 708 постах
Вообще, все ключи, кроме открытых, не имеют реализации getEncoded() (не экспортируемые).
Ключ сформирован корректно, если код выполнен без ошибок и key заполнен.

Отредактировано пользователем 27 января 2020 г. 13:04:18(UTC)  | Причина: Не указана

Offline Алексей Черенцов  
#5 Оставлено : 27 января 2020 г. 13:10:57(UTC)
Алексей Черенцов

Статус: Активный участник

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

Сказал(а) «Спасибо»: 14 раз
Хорошо, спасибо. А не подскажете тогда как из этого сгенерированного ключа получить соль для отдачи её наружу сервиса вместе с хэшом? В Java CSP ключ генрировали как:

Код:
        MessageDigest md1 = MessageDigest.getInstance(JCP.GOST_DIGEST_2012_256_NAME, JCSP.PROVIDER_NAME);
        md1.update(randomKeyBlob);
        byte[] key1 = md1.digest();
        SecretKeySpec spec1 = new SecretKeySpec(key1, JCSP.GOST_CIPHER_NAME);


а на выход сервера шёл хэш и соль в виде:

Код:
        Encoder encoder = new Encoder();
	return new String[] {encoder.encode(result), encoder.encode(key1)}


А тут не понятно, как из ключа сгенерированного

Код:
SecretKey key = kg.generateKey();


соль извлечь для возврата из сервиса.

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

Offline Евгений Афанасьев  
#6 Оставлено : 27 января 2020 г. 14:28:41(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 22 раз
Поблагодарили: 751 раз в 708 постах
В JCP (CryptoProvider) пока такой функционал не поддерживается (в JCSP он добавлялся в рамках одного из ТЗ).
Offline Алексей Черенцов  
#7 Оставлено : 28 января 2020 г. 5:41:38(UTC)
Алексей Черенцов

Статус: Активный участник

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

Сказал(а) «Спасибо»: 14 раз
А как тогда организовывать проверку HMAC? Вот на Java CSP у нас как делается генерация HMAC для неких Данных на сервере:

1) получаем Данные от клиента
2) генерируем Соль
3) на основании Соли генерируем ключ
4) на основании ключа и Данных создаём HMAC
5) отправляем клиенту HMAC и Соль

А проверка неизменности Данных идёт следующим образом:
1) получаем Соль и Данные
2) на основании Соли генерируем ключ
3) на основании ключа и Данных создаём HMAC
4) отправляем клиенту HMAC
5) клиент сличает полученный и имеющийся HMAC

Каков тогда алгоритм работы с HMAC в JCP?

Отредактировано пользователем 28 января 2020 г. 5:42:51(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#8 Оставлено : 28 января 2020 г. 9:27:29(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 22 раз
Поблагодарили: 751 раз в 708 постах
Немного неправильно сказал. Есть возможность передать SecretKeySpec в SecretKeyFactory, но поддерживаются только старые параметры шифрования и ключи алгоритма ГОСТ 28147 (256 бит). Доработки будут сделаны, но уже в следующих сборках.

Отредактировано пользователем 28 января 2020 г. 9:56:05(UTC)  | Причина: Не указана

Offline Алексей Черенцов  
#9 Оставлено : 28 января 2020 г. 10:13:38(UTC)
Алексей Черенцов

Статус: Активный участник

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

Сказал(а) «Спасибо»: 14 раз
Так это же замечательно! А есть какой либо пример кода для JCP с "возможность передать SecretKeySpec в SecretKeyFactory" пусть и по старому стандарту? Нас на первое время вполне устроит.
И сроки внедрения новых гостов уже есть хотя бы приблизительные? Ну там - пара месецев/год/через два релиза.
Offline Евгений Афанасьев  
#10 Оставлено : 28 января 2020 г. 10:40:24(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 22 раз
Поблагодарили: 751 раз в 708 постах
Ориентировочно, следующую сборку выложим через 2-3 месяца.
Вызвать можно примерно так:
Код:

SecretKeyFactory factory = SecretKeyFactory.getInstance("GOST28147", CryptoProvider.PROVIDER_NAME);
SecretKeySpec spec = new SecretKeySpec(<key>, null); // ключ ГОСТ 28147 (256 бит), параметры шифрования Verba0
SecretKey secretKey = factory.generateSecret(spec);

Отредактировано пользователем 28 января 2020 г. 10:41:36(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
Алексей Черенцов оставлено 28.01.2020(UTC)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (2)
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.