Статус: Новичок
Группы: Участники
Зарегистрирован: 20.10.2017(UTC) Сообщений: 3
|
Здравствуйте. Разбираюсь с веб-сервисом ФСС для электронных больничных. Застрял на формировании хэша элемента "S:Body" по алгоритму ГОСТ34.11-94. С тестового кабинета ФСС скачал их корректный запрос (GETLNINS_3103275205_2017_10_12_00010_request.xml.xml). В нём элементу Код:<S:Body wsu:Id="REGNO_3103275205"><ns1:getPrivateLNData xmlns:ns1="http://ru/ibs/fss/ln/ws/FileOperationsLn.wsdl" xmlns:ns2="http://ru/ibs/fss/ln/ws/FileOperationsLnInternal.wsdl" xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:eln="http://ru/ibs/fss/ln/ws/FileOperationsLn.wsdl" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:xml="http://www.w3.org/XML/1998/namespace"><ns1:regNum>3103275205</ns1:regNum><ns1:lnCode>290195190104</ns1:lnCode><ns1:snils>09365295200</ns1:snils></ns1:getPrivateLNData></S:Body>
соответствует хэш Код:<DigestValue>g2gM6UHHFESVK0JbH/yDCBOXlWQM2ZV24gGfEszLD1Y=</DigestValue>
Из форума на foxclub.ru переделал код для формирования хэша Код:*Расчет хэш Igor Korolyov
clear
? calculatemd5(FILETOSTR("test.txt"))
PROCEDURE calculatemd5
LPARAMETERS tcInput
* Получаем хэш от переданной строки
#DEFINE dnPROV_RSA_FULL 1
#DEFINE PROV_GOST_2001_DH 75
#DEFINE dnCALG_MD5 0x8003
#DEFINE dnCALG_GR3411 0x801E
#DEFINE dnHP_HASHVAL 0x0002
DECLARE INTEGER CryptAcquireContext IN WIN32API ;
INTEGER @, STRING, STRING, INTEGER, INTEGER
DECLARE INTEGER CryptCreateHash IN WIN32API ;
INTEGER, INTEGER, INTEGER, INTEGER, INTEGER @
DECLARE INTEGER CryptHashData IN WIN32API ;
INTEGER, STRING, INTEGER, INTEGER
DECLARE INTEGER CryptGetHashParam IN WIN32API ;
INTEGER, INTEGER, STRING @, INTEGER @, INTEGER
DECLARE INTEGER CryptDestroyHash IN WIN32API ;
INTEGER
DECLARE INTEGER CryptReleaseContext IN WIN32API ;
INTEGER, INTEGER
LOCAL lnProviderHandle, lnHashHandle, lcHash, lnHashLen
lnProviderHandle = 0
lnHashHandle = 0
lcHash = SPACE(16)
lcHash = SPACE(32)
lnHashLen = 16
lnHashLen = 32
IF CryptAcquireContext(@m.lnProviderHandle, "", "", PROV_GOST_2001_DH, 0xF0000000) = 0
MESSAGEBOX("Ошибка получения CryptoAPI контекста")
RETURN ""
ENDIF
IF CryptCreateHash(m.lnProviderHandle, dnCALG_GR3411, 0, 0, @m.lnHashHandle) = 0
MESSAGEBOX("Ошибка создания хендла хеша")
CryptReleaseContext(m.lnProviderHandle, 0)
RETURN ""
ENDIF
IF CryptHashData(m.lnHashHandle, m.tcInput, LEN(m.tcInput), 0) = 0
MESSAGEBOX("Ошибка хеширования")
CryptDestroyHash(m.lnHashHandle)
CryptReleaseContext(m.lnProviderHandle, 0)
RETURN ""
ENDIF
IF CryptGetHashParam(m.lnHashHandle, dnHP_HASHVAL, @m.lcHash, @m.lnHashLen, 0) = 0
MESSAGEBOX("Ошибка получения хеша")
CryptDestroyHash(m.lnHashHandle)
CryptReleaseContext(m.lnProviderHandle, 0)
RETURN ""
ENDIF
CryptDestroyHash(m.lnHashHandle)
CryptReleaseContext(m.lnProviderHandle, 0)
=STRTOFILE(STRCONV(m.lcHash, 13),'1.txt')
RETURN STRCONV(m.lcHash, 13) &&возвращает хэш в base64
ENDPROC
Но получается совершенно другой хэш: Код:a7CJeE2xDLoKNWtNHpFefJWsozIsI0jmSy643viOFXY=
Пробовал и утилиты rhash,cpverify. Корректного хэша так и не добился. Через soapUI тестировал GETLNINS_3103275205_2017_10_12_00010_request.xml.xml Если изменить "S:Body" (или DigestValue), то запрос не работает. Т.е. в запросе DigestValue действительно хранит хэш элемента S:Body. Подскажите, пожалуйста, как в ФСС рассчитывают хэш? В их спецификации описывается, что применяется ГОСТ34.11-94 и base64.
|