Статус: Активный участник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,098  Откуда: Крипто-Про Сказал(а) «Спасибо»: 22 раз Поблагодарили: 751 раз в 708 постах
|
Добрый день. Возможно, когда писалась документация (N лет назад), в классе KeyGenerator еще не было двух функций, принимающих по одному аргументу. Попробуйте, например, указать так: Код:
kg.init((SecureRandom)null);
Спасибо, исправим в документации. |
|
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 30.10.2019(UTC) Сообщений: 56  Откуда: Новосибирск Сказал(а) «Спасибо»: 14 раз
|
Ха, изначально я так и сделал. Но у меня возникли подозрения, что при этом сформировался пустой ключ. Сдалал я это предположение на основании того, что:
key.getEncoded() == null
При этом в алгоритме реализованном на Java CSP:
key.getEncoded() != null
То есть вопрос заключается сейчас в следующем, как определить, что ключ сформировался корректно? Нормально ли, что key.getEncoded() == null.
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,098  Откуда: Крипто-Про Сказал(а) «Спасибо»: 22 раз Поблагодарили: 751 раз в 708 постах
|
Вообще, все ключи, кроме открытых, не имеют реализации getEncoded() (не экспортируемые). Ключ сформирован корректно, если код выполнен без ошибок и key заполнен. Отредактировано пользователем 27 января 2020 г. 13:04:18(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)
| Причина: Не указана
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,098  Откуда: Крипто-Про Сказал(а) «Спасибо»: 22 раз Поблагодарили: 751 раз в 708 постах
|
В JCP (CryptoProvider) пока такой функционал не поддерживается (в JCSP он добавлялся в рамках одного из ТЗ). |
|
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,098  Откуда: Крипто-Про Сказал(а) «Спасибо»: 22 раз Поблагодарили: 751 раз в 708 постах
|
Немного неправильно сказал. Есть возможность передать SecretKeySpec в SecretKeyFactory, но поддерживаются только старые параметры шифрования и ключи алгоритма ГОСТ 28147 (256 бит). Доработки будут сделаны, но уже в следующих сборках. Отредактировано пользователем 28 января 2020 г. 9:56:05(UTC)
| Причина: Не указана |
|
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 30.10.2019(UTC) Сообщений: 56  Откуда: Новосибирск Сказал(а) «Спасибо»: 14 раз
|
Так это же замечательно! А есть какой либо пример кода для JCP с "возможность передать SecretKeySpec в SecretKeyFactory" пусть и по старому стандарту? Нас на первое время вполне устроит. И сроки внедрения новых гостов уже есть хотя бы приблизительные? Ну там - пара месецев/год/через два релиза.
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана |
|
 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close