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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline Харчев Алексей  
#1 Оставлено : 26 сентября 2025 г. 10:54:52(UTC)
Харчев Алексей

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

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

Всем доброго дня
Прошу помощи у более опытных коллег

у меня возникла необходимость выполнять код, который выполнялся на 1С, на языке Python
На моей машине установлен КриптоПро CSP 5.0.12417, КриптоПро ЭЦП SDK 2.0.14556

Вкратце: я получаю массив чисел типа VT_UI1, оборачиваю его в массив COMSafeArray, создаю объект HashedData и вычисляю хэш массива чисел
На 1С у меня код отрабатывает, но на той же машине на PyCharm я получаю ошибку "Класс CAdESCOM.HashedData не зарегистрирован".
Я для теста установил КриптоПро ЭЦП Browser plug-in (cadesplugin.exe), то код на Python выполняется, но я получаю другой результат хэша

элементы МассивCOM в 1С и в Python - одни и те же числа, я b[ сравнивал, все значения чисел и их порядок одинаковый
[48, 130, 9, 90, 48, 130, 9, 7, 160, 3, 2, 1, 2, 2, 17, 2, 187, 61, 216, 0, 57, 179, 190, 182, 72, 219, 170, 10, 183, 124, 236, 229, 48, ...


Подскажите, пожалуйста,

Код 1С:
Функция СформироватьХэшСертификата(Сертификат)
ДанныеСертификата = Сертификат.Выгрузить()
БуферДвоичныхДанных = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ДанныеСертификата);
МассивДанных = Новый Массив;

k = БуферДвоичныхДанных.Размер - 1;
Для i = 0 По k Цикл
МассивДанных.Добавить(БуферДвоичныхДанных.Получить(i));
КонецЦикла;

МассивCOM = Новый COMSafeArray(МассивДанных, "VT_UI1");
HASH_ALGORITHM = 101;
HashedData = Новый COMОбъект("CAdESCOM.HashedData");
HashedData.Algorithm = HASH_ALGORITHM;
HashedData.Hash(МассивCOM);

БуферДвоичныхДанных = ПолучитьБуферДвоичныхДанныхИзHexСтроки(HashedData.Value);
ХэшСертификата = ПолучитьBase64СтрокуИзБуфераДвоичныхДанных(БуферДвоичныхДанных);

Возврат ХэшСертификата;
КонецФункции

Код Python:
def calculate_certificate_hash(thumbprint_hex):
HASH_ALGORITHM = 101

cert_ctx = get_certificate_from_standard_cryptography_store(thumbprint_hex)
cert_bytes = cert_ctx.get_encoded()
cert = x509.load_der_x509_certificate(cert_bytes, default_backend())

cert_bytes = cert.public_bytes(serialization.Encoding.DER)
safe_array = cl.VARIANT(pythoncom.VT_UI1, list(cert_bytes)) # еще я пробовал cl.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_UI1, list(cert_bytes))

pythoncom.CoInitializeEx(pythoncom.COINIT_APARTMENTTHREADED)
hashed_data = cl.Dispatch('CAdESCOM.HashedData')
hashed_data.Algorithm = HASH_ALGORITHM
hashed_data.Hash(safe_array)

return hashed_data.Value

Справочно: Начало main.py
import wincertstore # НО ТЕМ НЕ МЕНЕЕ!!! все остальные библиотеки не помогли
import base64
import ssl
import sys
import os
from cryptography import x509
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives import hashes
import win32com.client as cl
import pythoncom
Online Андрей *  
#2 Оставлено : 26 сентября 2025 г. 12:55:18(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,931
Мужчина
Российская Федерация

Сказал «Спасибо»: 599 раз
Поблагодарили: 2336 раз в 1833 постах
Здравствуйте.


Итоговая цель какая?
Подписывать файлы?

Примеры смотреть pycades
+ основные примеры в разделе с js.


cert_bytes = cert.public_bytes

И? Зачем public_bytes?
Зачем получать хеш по ГОСТу от разной информации?

Нужен хеш сертификата? Он в thumbprint_hex и там не ГОСТ же используется.

Цитата:

Вкратце: я получаю массив чисел типа VT_UI1, оборачиваю его в массив COMSafeArray, создаю объект HashedData и вычисляю хэш массива чисел


А это корректно?

Какой хеш будет у слова: Привет?
в ascii

p.s.

Цитата:
На моей машине установлен КриптоПро CSP 5.0.12417


Обновиться до 5.0.13000.

Техническую поддержку оказываем тут
Наша база знаний
Offline Харчев Алексей  
#3 Оставлено : 26 сентября 2025 г. 15:26:47(UTC)
Харчев Алексей

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

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

моя цель - потихоньку переписать существующий код. Поменять его сразу кардинально я не надеюсь
И я не услышал даже намека про доступность класса HashedData

Отредактировано пользователем 26 сентября 2025 г. 15:29:17(UTC)  | Причина: Не указана

Offline Новожилова Елена  
#4 Оставлено : 26 сентября 2025 г. 15:37:32(UTC)
Новожилова Елена

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

Группы: Администраторы, Участники
Зарегистрирован: 10.12.2008(UTC)
Сообщений: 935
Женщина
Откуда: Крипто-Про

Поблагодарили: 111 раз в 101 постах
Я не до конца понимаю в чём ваш вопрос.
Если в доступности на Python объекта "CAdESCOM.HashedData" - то вы сами пишете, что после установки КриптоПро ЭЦП Browser plug-in (cadesplugin.exe) код на python у вас выполняется.
Значит с доступностью объекта проблема решена? Или нет? Тогда в чём она?

Если вопрос в том, что хэшируя разные данные вы получаете разные хэш-значения, то так и должно быть.
Online Андрей *  
#5 Оставлено : 26 сентября 2025 г. 17:26:47(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,931
Мужчина
Российская Федерация

Сказал «Спасибо»: 599 раз
Поблагодарили: 2336 раз в 1833 постах
Автор: Харчев Алексей Перейти к цитате
моя цель - потихоньку переписать существующий код. Поменять его сразу кардинально я не надеюсь
И я не услышал даже намека про доступность класса HashedData


Ответа нет.

Есть thumbprint у сертификатов и другие сведения, всё нужно получать через CAdESCOM.
Как подписывать\проверять - примеры есть.
Техническую поддержку оказываем тут
Наша база знаний
Online Андрей *  
#6 Оставлено : 26 сентября 2025 г. 17:36:56(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,931
Мужчина
Российская Федерация

Сказал «Спасибо»: 599 раз
Поблагодарили: 2336 раз в 1833 постах
Автор: Харчев Алексей Перейти к цитате


Справочно: Начало main.py
import wincertstore # НО ТЕМ НЕ МЕНЕЕ!!! все остальные библиотеки не помогли
import base64
import ssl
import sys
import os
from cryptography import x509
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives import hashes
import win32com.client as cl
import pythoncom


какое это умеет отношение к решению задач?


Техническую поддержку оказываем тут
Наша база знаний
Offline Харчев Алексей  
#7 Оставлено : 26 сентября 2025 г. 18:33:32(UTC)
Харчев Алексей

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

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

Автор: Новожилова Елена Перейти к цитате
Я не до конца понимаю в чём ваш вопрос.
Если в доступности на Python объекта "CAdESCOM.HashedData" - то вы сами пишете, что после установки КриптоПро ЭЦП Browser plug-in (cadesplugin.exe) код на python у вас выполняется.
Значит с доступностью объекта проблема решена? Или нет? Тогда в чём она?

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


Подождите, я изначально в теме написал, что массивы абсолютно одинаковые, хотя первоначально я подозревал, что это не так и некоторые различия в объектах все же имеются

Я также написал, что 1С каким-то образом получает объект HashedData без установленного КриптоПро ЭЦП Browser plug-in (cadesplugin.exe)
Если бы полученные результаты хэширования массива в 1С и Python совпали, я был бы полностью удовлетворен результатом и вообще не поднимал эту тему

А по факту какая-то мистика

Кстати, на другой машине с обновленным КриптоПро результат функции на Python не изменился.
Да, я забыл написать что у меня 64-битная Windows

Отредактировано пользователем 26 сентября 2025 г. 18:34:59(UTC)  | Причина: Не указана

Online Андрей *  
#8 Оставлено : 26 сентября 2025 г. 23:32:02(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,931
Мужчина
Российская Федерация

Сказал «Спасибо»: 599 раз
Поблагодарили: 2336 раз в 1833 постах

Строка:
Привет!

hex:
CF F0 E8 E2 E5 F2 21


Какой хеш выдают 2 варианта?


14987BD66D363BC93A7E3503323FFF77DF9EEE031F1EFBD1A5E988D00512E47A
Такой в hex?
Техническую поддержку оказываем тут
Наша база знаний
Online Андрей *  
#9 Оставлено : 26 сентября 2025 г. 23:37:30(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,931
Мужчина
Российская Федерация

Сказал «Спасибо»: 599 раз
Поблагодарили: 2336 раз в 1833 постах
Техническую поддержку оказываем тут
Наша база знаний
Online Андрей *  
#10 Оставлено : 26 сентября 2025 г. 23:39:18(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,931
Мужчина
Российская Федерация

Сказал «Спасибо»: 599 раз
Поблагодарили: 2336 раз в 1833 постах
HashedData::DataEncoding

Цитата:
Примечания
Данное свойство задает кодировку данных, передаваемых в метод Hash, и должно быть задано до того, как будет впервые вызван метод Hash. По умолчанию свойство имеет значение CADESCOM_STRING_TO_UCS2LE. Задание свойства DataEncoding сбрасывает состояние объекта.
Техническую поддержку оказываем тут
Наша база знаний
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (2), Андрей *
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.