Вычисление отпечатка файла по алгоритму вычисления хэш-функции, соответствующему ГОСТ 34.11 с помощью OpenSSL.

В СМЭВ 3.х появилось файловое хранилище, оно обязательно, если суммарный объем вложений сообщения превышает 5 Мб. При этом суммарный объем файлов сообщения увеличивается до 1 Гб.

Выдержка из документации СМЭВ 3.х по работе с файловым хранилищем:
вычислить отпечаток файла по алгоритму вычисления хэш-функции, соответствующему ГОСТ 34.11;


Как вычислить хэш и что нам понадобится?

Так сложилось, не все ведут разработку программного обеспечения для госуслуг на Java (СМЭВ предлагает пример клиента с реализацией всего функционала), поэтому пришлось как-то выкручиваться.

Все действия производились на компьютере под управлением Windows 7 professional x64 с установленной бесплатной библиотекой OpenSSL версии 1.0.2e.

ГОСТ Р 34.11-94 криптографическая хэш-функция

Стандарт ГОСТ Р 34.11-94, разработан в 1994 г. и описывает российскую криптографическую хэш-функцию. Можете Скачать текст ГОСТ Р 34.11-94.

Конфигурирование OpenSSL.

Редактируем файл openssl.cfg

В начало конфигурационного файла OpenSSL, openssl.cnf добавляем:

openssl_conf = openssl_def

и в конец файла вставляем:

[openssl_def]
engines = engine_section
[engine_section]
gost = gost_section
[gost_section]
default_algorithms = ALL
engine_id = gost

Описание вставленных параметров:

  • Параметр default_algorithms указывает на использование движком всех алгоримов, которые есть в движке
  • Параметр engine_id указывает на название движка значение gost

Сохраняем конфигурационный файл.

Вычисление хеш по ГОСТ 34.11

Консольная утилита openssl входящая в бесплатную библиотеку OpenSSL 1.0.2e поддерживает ГОСТ Р 34.11-94 c параметрами CryptoPro. Формат вывода хэша - младшие байты первыми.

Создадим пустой текстовый файл empty.txt, от которого мы будем получать хэш. Запускаем командную консоль Windows (командой cmd)
Пример вызова:
openssl dgst -md_gost94 empty.txt
Результат:
md_gost94(empty.txt)= 981e5f3ca30c841487830f84fb433e13ac1101569b9c13584ac483234cd656c0

Для вычисления параметра Hash в xml описании передаваемого в файловое хранилище СМЭВ 3.х, необходимо полученный хеш представленный в hex виде перекодировать в Base64.

openssl dgst -md_gost94 -binary путь_имя_файла | openssl base64 -out путь_имя_файла.hash

Вот и все.

Важно!

Кстати сразу не заработало, пока не были установлены конфигурационные константы для openssl в командной строке выполните команды:
set OPENSSL_CONF=путь_до_файла\openssl.cfg
set OPENSSL_ENGINES=путь_до_openssl

Контрольные значения

Значение хеша для пустого файла empty.txt:
хеш 981e5f3ca30c841487830f84fb433e13ac1101569b9c13584ac483234cd656c0

Значение хеша в base64 для пустого файла empty.txt:
mB5fPKMMhBSHgw+E+0M+E6wRAVabnBNYSsSDI0zWVsA=

P.S.

Большое спасибо Орлову Юрию из компании Лисси Крипто в помощи по настройке openssl, настоящий профессионал своего дела.

Это мой первый пост, прошу прощение за какие-то неточности и корявости изложения.