Нужно MD5 и SHA1 #659507


#0 by mvgfirst
Для работы с вебсервисом банка необходимо все XML-ки "шифровать" используя оба алгоритма (так-то там все замороченее еще и base64 используется - но с ним вроде бы ясно все) С банком работать предполагается через Регаламентные задания, которые "крутятся" на x64 сервере. Подскажие как получить Хеши и MD5 и SHA1 на сервере 1С предприятия. Я нашел компоненту StringsNative - она это умеет, но к сожалению только для x86. На севрере x64 - она не подключатеся. Кто как решал такую задачу? Уверен я не первый кто столкнулся с проблемой.
#1 by alexei366
Хеши и MD5 и SHA1 файлов? или чего поконкретней опиши
#2 by mvgfirst
Я работаю с вебсервисом банка, подписываю кредитные договора Для подписания необходимо что бы POST запросом отправлялся XML файл (определенной структуры как надо банку) который должен быть закодирован через base64, а потом из результирующего файла получаем хеш SHA1 потом конкатенируем результаты и 1000 раз вычисляем хеш MD5 - и уже после этого сам файл и полученный хеш отправляем в банк Короче - не я это придумал - но альтернативы нет )))) И пока тестил на клиенте - все работало - положил в регламетное задание - перестала загружаться компонента. Автора попросил - что бы он скомпилил x64 но уверенности что он это сделает нет никакой - поэтому ищу альтернативные способы решения
#3 by drcrasher
тебе в помощь
#4 by mvgfirst
И каким образом это мне поможет?!
#5 by drcrasher
в статью на вики ходил? надпись "есть для винды" видел? скачать/поставить на сервер/потестить пробовал? почитать про wsh и написать скрипт не? хотя такая задачка одним чудикам обошлась в 5Круб. ;)
#6 by РыжийОвощ
кури capicom.dll
#7 by fisher
А оно под винду COM-объекты даёт?
#8 by alexei366
корочь гугли Новый COMОбъект("CAPICOM.HashedData");, на серваке должна быть зарегана бибиотека CAPICOM.dll, тама вроде найдёшь и sha1 и md5. А md5 кстати в 1С вычислить можно, я так сам делаю, там пишешь Новый Хеш...(точно не помню), а далее по СП
#9 by РыжийОвощ
а это разве не возможность 8.3?
#10 by alexei366
про md5 да, у меня 8.3.2
#11 by mvgfirst
А Native? Не то что бы я придираюь - но как-то не люблю я COM-объекты, особенно если хи регистрировать надо. Ясень пень что "на безбабий и рыбу раком" - но вдруг.... )))
#12 by alexei366
CAPICOM вроде в каждой винде есть по умолчанию
#13 by vde69
CAPICOM на 64х сервере не работает (по крайне мере у меня не вышло ее запустить)
#14 by khajit
для MD5 делал внешнюю native компоненту по 64х сервер, другие варианты показались либо тормозными либо сложнореализуемыми
#15 by mvgfirst
А поделится с общественностью? возможно?
#16 by khajit
скинь контакты
#17 by alexei366
фигня какаято, я тут по работе сталкиваюсь с программами которые используют данную библиотеку, так и на 32 и на 64 всё норм работает.
#18 by Лефмихалыч
там есть все, что надо, включая wsc, который можно зарегить, как ActiveX-объект и использовать через Новый COMОбъект
#19 by mvgfirst
Куда скинуть?
#20 by sapphire
Используй бетку 8.3 - она это умеет :)
#21 by mvgfirst
Не уверен что это разумно, у меня рабочая база, и переводить ее на 8.3 боязно как-то опять же лицензия (то да сё)
#22 by ptiz
в БСП есть функция ВычислитьХешСтрокиПоАлгоритмуMD5
#23 by Ёпрст
#24 by Ёпрст
|var b64pad  = """"; /* base-64 pad character. ""="" for strict RFC compliance   */        |var chrsz   = 8;  /* bits per input character. 8 - ASCII; 16 - Unicode      */        |}        |        | * If chrsz is ASCII, characters >255 have their hi-byte silently ignored.
#25 by mrWatson
а MD5 в строку могёшь?
#26 by mvgfirst
Я нечто подобное использовал, нашел в Интернетах в виде обработки, без использования скриптов Но я не нашел SHA1
#27 by mvgfirst
Про эту компоненту я писал в - она незаработала в х64 сервере
#28 by mvgfirst
Кстати в комментах к ней (поуказанной ссылке)я же и отписался об этом.
#29 by Serginio1
#30 by Steelvan
#31 by Torquader
Я писал md5 на VbScript, причём используя только умножение и деление вместо сдвиговых операций. В принципе, можно и на языке 1С это всё написать. Просто берётся код алгоритма на Си и пишется транслятор, который честно отрабатывает указанные в коде действия через доступные операции - получается рабочий код на заданном языке программирования. P.S. md5 на VbScript здесь уже выкладывал.
#32 by mvgfirst
MD5 на языке 1С - у меня уже и так есть Мне бы еще хотя-бы sha1 получить и я бы обошелся вообще без внешней компоненты. К сожалению из меня весьма посредственный транслятор с других языков, да и сам принцип работы этих алгоритмов я незнаю (не нужны они не были 12 лет, и думаю сейчас единичный случай) А времени эксперементировать с вышеуказанными ссылками особо не наблюдается, вот поэтому и ищу готовые варианты. Поэтому и опираюсь в основном на готовую внешнюю компоненту (StringsNative) - потому что в ней уже все есть и готово к употреблению.
#33 by Лефмихалыч
[:||||||||||||:] см
#34 by mvgfirst
Обнаружил еще один интересный факт связанный с быстродействием. Мне по требованиям банка MD5 нужно рассчитать 1000 раз Я, нашел обработки которые считают и SHA1 и MD5 на языке 1С без использования чего либо стороннего вообще. Оказалось: 1. Все что я нашел некорректным образом работает с данными на русском языке 2. Работает все это ацки-медленно!!!! Проверял используя внешнюю компоненту StringsNative (ссылка на ветку инфостарта про нее выше в топике) Даже 10 раз считает очень медленно (2 секунды) Внешняя компонента считает меньше чем секунда даже 1000 раз
#35 by Torquader
Я писал Md5 на VbScript - работает всё равно очень медленно, но на файлах даёт правильный результат. Что касается 1С версии 8, то тут как и в JavaScript - все символы двухбайтовые, то есть мы не можем разложить строку на байты, так как она двухбайтовая (значение КодСимвола не даёт нам байт). В результате мы получаем расчёт неизвестно чего, так как нам нужно или считать строку двухбайтовой (а тогда мы не совпадём с другими алгоритмами) или переводить строку в однобайтовую, чтобы можно было её разложить на последовательность байтов.
#36 by mvgfirst
Приблизительно понял о чем Вы говорите. правильно ли я сделал вывод - что для того что бы корректно посчитать хеш MD5 нужно сохранить строку в файл, а уже его потом как Двоичные данные прогнать через функцию расчета хеша?
#37 by mvgfirst
Используя скрпиты, у меня получилось приблизится к скорости расчета хешей такой же как и у Внешней компоненты. И хотя в моем конкретном случая я буду использовать только 1С сервер на платформе Windows - мне кажется что нужно искать способ кросс-платформенный. И хотя сами скрипты написаны на джаве (которая вроде бы кросс-платформенная) - способ их вызоыва через MSScriptControl - не совсем кросплатформенное решение З.Ы. Я понимаю что 8.3 - это выход из ситуации и никто уже не будет изобретать ничего нового - но ведь многие до сих пор используют 7.7 а уж сколько останется на 8.2 и не перейдут на 8.3 - предсказать еще труднее
#38 by Torquader
SHA1 вообще простой - я его в VbScript переписал, используя только арифметические операции, но для суммирования нужно целочисленное деление и остаток от деления, которые в 1С не очень быстрые операции. Что касается кодов символов, то по стандарту считается, что кодировка должна быть UTF-8, и Unicode из 1С в неё прекрасно переводится несколькими операциями.
#39 by Torquader
В восьмёрке даже массив превратили в чёрт знает что - если рассматривать число как слово в 32 бита, то доступ к каждому биту - получение свойства объекта - медленнее не представить. Конечно, можно все 32-шага по разобрать.
#40 by Torquader
Короче - вот оно в VbScript: Sub Sha1_InitConst(ByRef A,ByRef B,ByRef C,ByRef D,ByRef E,ByRef K1,ByRef K2,ByRef K3,ByRef K4)    A=0 Sub Sha1_OutResult(ByRef A,ByRef B,ByRef C,ByRef D,ByRef E,ByRef R)    p=31    For i=0 To 7 Step 1        k=0        For j=0 To 3 Step 1            k=(k*2)+A(p)    For i=0 To 7 Step 1        k=0        For j=0 To 3 Step 1            k=(k*2)+B(p)    For i=0 To 7 Step 1        k=0        For j=0 To 3 Step 1            k=(k*2)+C(p)    For i=0 To 7 Step 1        k=0        For j=0 To 3 Step 1            k=(k*2)+D(p)    For i=0 To 7 Step 1        k=0        For j=0 To 3 Step 1            k=(k*2)+E(p) End Sub ' Выполнение шага алгоритма Sub SHA1_CalculateStep(ByRef A,ByRef B,ByRef C,ByRef D,ByRef E,ByRef M,ByRef K1,ByRef K2,ByRef K3,ByRef K4)    Next    For i=0 To 15 Step 1        For j=0 To 31 Step 1            W(j,i)=M(j,i)        Next    Next    For i=16 To 79 Step 1        For j=0 To 30 Step 1    Next    For i=0 To 19 Step 1        q=0        For j=0 To 31 Step 1            If(B(j)+C(j))>1 Then q=q+1 Else If(B(j)=0)AND(D(j)=1)Then q=q+1            If j>=5 Then q=q+A(j-5) Else q=q+A(j+27)            q=q+E(j)+K1(j)+W(j,i)            T(j)=q Mod 2            q=q2            D(j)=C(j)            If j<30 Then C(j)=B(j+2) Else C(j)=B(j-30)        Next        For j=0 To 31 Step 1            B(j)=A(j)        Next    Next    For i=20 To 39 Step 1        q=0        For j=0 To 31 Step 1            If j>=5 Then q=q+A(j-5) Else q=q+A(j+27)            q=q+E(j)+K2(j)+W(j,i)            T(j)=q Mod 2            q=q2            D(j)=C(j)            If j<30 Then C(j)=B(j+2) Else C(j)=B(j-30)        Next        For j=0 To 31 Step 1            B(j)=A(j)        Next    Next    For i=40 To 59 Step 1        q=0        For j=0 To 31 Step 1            If(B(j)+C(j)+D(j))>1 Then q=q+1            If j>=5 Then q=q+A(j-5) Else q=q+A(j+27)            q=q+E(j)+K3(j)+W(j,i)            T(j)=q Mod 2            q=q2            D(j)=C(j)            If j<30 Then C(j)=B(j+2) Else C(j)=B(j-30)        Next        For j=0 To 31 Step 1            B(j)=A(j)        Next    Next    For i=60 To 79 Step 1        q=0        For j=0 To 31 Step 1            If j>=5 Then q=q+A(j-5) Else q=q+A(j+27)            q=q+E(j)+K4(j)+W(j,i)            T(j)=q Mod 2            q=q2            D(j)=C(j)            If j<30 Then C(j)=B(j+2) Else C(j)=B(j-30)        Next        For j=0 To 31 Step 1            B(j)=A(j)        Next    q=0    For i=0 To 31 Step 1        q=q+HA(i)+A(i)        A(i)=q Mod 2        q=q2    Next    q=0    For i=0 To 31 Step 1        q=q+HB(i)+B(i)        B(i)=q Mod 2        q=q2    Next    q=0    For i=0 To 31 Step 1        q=q+HC(i)+C(i)        C(i)=q Mod 2        q=q2    Next    q=0    For i=0 To 31 Step 1        q=q+HD(i)+D(i)        D(i)=q Mod 2        q=q2    Next    q=0    For i=0 To 31 Step 1        q=q+HE(i)+E(i)        E(i)=q Mod 2        q=q2 End Sub Function SHA1_CountForString(ByRef s)    n=l Mod 64    z=(l Mod 32)*8    For i=1 To m Step 1        For j=0 To 63 Step 1            y=j4            x=x+1            r=24-((j Mod 4)*8)            For q=1 To 8 Step 1                G(r,y)=k Mod 2                k=k2                r=r+1            Next    Next    If n<56 Then        m=m*64        For j=0 To 63 Step 1            y=j4            If j<n Then k=Asc(Mid(s,x,1))Else If j=n Then k=128 Else If j<56 Then k=0 Else k=z(63-j)            x=x+1            r=24-((j Mod 4)*8)            For q=1 To 8 Step 1                G(r,y)=k Mod 2                k=k2                r=r+1            Next        m=m*64        For j=0 To 63 Step 1            y=j4            If j<n Then k=Asc(Mid(s,x,1))Else If j=n Then k=128 Else k=0            x=x+1            r=24-((j Mod 4)*8)            For q=1 To 8 Step 1                G(r,y)=k Mod 2                k=k2                r=r+1            Next        For j=0 To 63 Step 1            y=j4            If j<56 Then k=0 Else k=z(63-j)            r=24-((j Mod 4)*8)            For q=1 To 8 Step 1                G(r,y)=k Mod 2                k=k2                r=r+1            Next Function ConvertStringToUTF8(ByRef s)    For i=1 To l Step 1        j=AscW(Mid(s,i,1))        If j<128 Then            ConvertStringToUTF8=ConvertStringToUTF8 & Chr(j)        ElseIf j<2048 Then            ConvertStringToUTF8=ConvertStringToUTF8 & Chr(192+(j64)) & Chr((j Mod 64)+128)        Else            ConvertStringToUTF8=ConvertStringToUTF8 & Chr((j2048)+224) & Chr(((j Mod 2048)64)+128) & Chr((j Mod 64)+128)
#41 by mvgfirst
Спасибо большое. Но я уже решил это через джаваскрипт. Щас другая проблема. При работе на клиенте - я получал base64 строку используя специальный метод компоненты StringsNatve, все работало правильно - банк у меня пакеты закодированные принимал. Но т.к. компонента работать на сервере не желает - решил воспользоваться методом 1С "base64Строка" - но он принимает на вход только двоичные данные. Я сохранил строку в файл и файл подал через "Новый ДвоичныеДанные" на вход этому методу. В итоге банк не принимает пакет. Сравнил результаты кодирования методом компоненты и метдом платормы - результаты разные.
#42 by Torquader
Ну а если собрать строку BASE64 вручную - там вообще ничего сложного нет. Я на 1С7.7 BASE 95 писал - BASE64 проще. Другое дело - как кодируется русский язык перед записью в BASE64 ?
#43 by Diversus
Тоже сталкивался мне нужно было найти MD5 и SHA-512. Процедуру получения MD5 можно найти в БСП в модуле отправки СМС. Как сделал SHA-512 можно посмотреть по ссылке Для SHA-1 можно использовать тот же подход...
#44 by mvgfirst
А можно эту процедуру сюда запостить? Я БСП не ставил себе, видел из далека - но там все так запутанно что с наскоку и не разберешся. Мне просто интересно - как они этот решили?
#45 by mvgfirst
Вот решил вопрос таким вот методом. Сейчас все три скрипта прикручу к регламентному заданию ну и посмотрим взлетит/невзлетит....
#46 by Torquader
JavaScript страдает невозможностью передачи параметров по ссылке - по этому я всегда использую VbScript - хотя BASE64 можно написать и на 1С. И не забываем, что для русских букв charCodeAt возвращает коды в районе 1024, что в BASE64 не засунешь - то есть нужно сначала переводить в UTF-8, а потом полученные байты переводить в BASE64 - иначе будет "забавно".
#47 by sttt
можно и хранимую процедуру сделать: {    public class Md5Class    {        [Microsoft.SqlServer.Server.SqlProcedure]        public static void HashString(SqlString value, out SqlString result)            }    } } компилим: %SYSTEMROOT%Microsoft.NETFrameworkv2.0.50727csc.exe /target:library c:xp_md5.cs потом включаем разрешение на SQL сервер использование CLR sp_configure 'clr enabled', 1 go reconfigure go подключаем наш модуль: CREATE ASSEMBLY CLRFunctions FROM 'C:xp_md5.dll' go создадим пользовательскую функцию: CREATE FUNCTION [dbo].[fn_md5] (@data TEXT) RETURNS CHAR AS BEGIN  DECLARE @hash CHAR  EXEC master.dbo.xp_md5 @data, -1, @hash OUTPUT END
#48 by mvgfirst
По идее - я не буду использовать русские символы в тех данных которые кодирую с помощью своих функций В этом мне повезло Однако ваши замечания справедливы. Но я не такой "суровый" программист что бы вытворять такое.... я больше на уровне бизнес-логики... поэтому очень рад буду если наконец-то появится внешняя компонента реализующая все эти механизмы и с русскими буквами в том числе.
#49 by mvgfirst
Почему вот это: не работает когда вызывается из регламентного задания НО работает когда вызываю из обработки на клиенте? И клиент и сервер запущены на одной машине. Сервер х64
#50 by mvgfirst
Выдает ошибку "Ошибка при вызове конструктора (COMОбъект): Class not registered: Class not registered"
#51 by sapphire
MSScriptControl.ScriptControl не поддерживается на серверных осях х64
#52 by sapphire
#53 by sapphire
Там основная идея в использовании objCrypt = Новый COMОбъект("System.Security.Cryptography.MD5CryptoServiceProvider");
#54 by sapphire
Так же для SHA1:
#55 by sapphire
Описание API:
#56 by mvgfirst
Пипец, я еле с javascript разобрался - у меня два дня на это ушло - эту хрень мне точно не разобрать...
#57 by sapphire
Что там разбирать-то? по ссылке в , за что ему, автору, спасиб: Функция DecToHex(Знач Число)    Если Число = 0 Тогда Возврат "00"; КонецЕсли;
#58 by mvgfirst
Мне еще нужны: SHA1 и Base64Строка (как я писал выше та что создается стандартной 1С-вской функцией - непринимается банком)
#59 by sapphire
Ты читать умеешь?
#60 by mvgfirst
Это я видел. Как мне с помощью этого получить Base64 из строки?
#61 by sapphire
objCrypt = Новый COMОбъект("System.Security.Cryptography.ToBase64Transform");
#62 by sapphire
#63 by sapphire
Ты уже определись, что именно нужно, по-уму, спасибо тому товарищу, в классе System.Security.Cryptography достаточно методов для реализации.
#64 by mvgfirst
Т.е. все днные которые мне нужно будет вычислять - мне придется писать в файл. И судя по условию моей задачи у меня будет минимум 1001 запись и чтение файла. А так что бы не писать в файл, нельзя?
#65 by 1Снег
А почему никто не предлагает только на 1С решение, это же чисто математическая задача
#66 by mvgfirst
Решение на 1С у меня есть (нашел в инете и на Инфостарте) Но это настолько медленно - что "не лезет ни в какие ворота!" В маштабах вычисления 1-го Хеша - это еще терпимо Но когда мне нужно для 100 файлов посчитать 1000 хешей для каждого - это занимает пол дня.
#67 by sapphire
Можно и не писать в файл.
#68 by sapphire
Да уж меня позабавило то, как мой недокод расползся по инетам...
#69 by sapphire
Вообще, есть в 1С такой объект как "Криптография"...
#70 by sapphire
Потому что медленно...
#71 by mvgfirst
Не писать? Это как? Передавать в ComputeHash строку?
#72 by mvgfirst
В 8.2 есть? Точно?
#73 by sapphire
Да, есть и оно как раз использует System.Security.Cryptography
#74 by sapphire
Массив байтовый
#75 by mvgfirst
Как получить битовый массив в 1с? Можно пример?
#76 by Torquader
Я вчера написал SHA1 на языке 1С. Причём используя только переменные, в которых хранится 0 или 1. Все битовые операции перевёл в операции 1С. Но, 1С га..но! Потому как код получился на 3 мегабайта. Когда я это вставил в обработку, оно даже скомпилялось, только где-то строки порезались - и работать не стало. Самое смешное - при попытке удалить код из модуля формы (путём выделения и нажатия DEL) словил глюк - конфигуратор виснет намертво и ничего не делает. Пытался удалять по частям - из 70 с лишним тысяч строк осталось 5 тысяч, и всё равно повис, сволочь такая. В общем - 1С просто не годится, чтобы на ней что-то можно было бы написать нормальное. P.S. в прошлый раз md5 в 1С77 запихивал - напоролся на то, что там есть ограничение по длине строки, чтоб ей пусто было.
#77 by Torquader
Короче - 1000 раз за 39 секунд - устроит ? Только код 1С и никаких внешних объектов и т.п. Без вывода результата на экран получается 30 секунд. Короче - этот код на VbScript запускается и в файле мы получаем код для 1С, который по объёму гораздо длиннее.
#78 by mvgfirst
Огоромное спасибо за усилия, но 39 секунд не устроит. Код который я нашел на javascript выполняет это за 4 секунды (компонента по прежнему показывает результат меньше секунды) И еще на инфостарте, один уважаемый человек пообещал скомпилить библиотечку под х64 Так что ждемс....
#79 by kvk
Если нужна кроссплатформенность, то может из этого что получится (скорость на полгиговом файле та же, что и на PowerShell):    |    |def md5sum(filename):    |    with open(filename,'rb') as f:    |        for chunk in iter(lambda: f.read(128*md5.block_size), b''):    |    |if __name__ == '__main__':    |        |    with open(input, 'rb') as i:    |        with open(output, 'wb') as o:    |        |    for i in range(1000):    |
#80 by mvgfirst
Кросплатформенность - это не приоритет вообще. Просто если у решения она будет - значит решению дополнительный "+" А по коду вопорос, для его использования создается: Разве COMОбъект - это кроссплатформенно? Спрашиваю, потом что неуверен что это сработает в Линуксовом варианте сервера.
#81 by kvk
Попробуй ЗапуститьПриложение. Это только набросок, если есть желание на пайтоне сделать и кроссплатформенно это скорее всего будет всего лишь одна из проблем.
#82 by Torquader
Если через "ЗапуститьПриложение", то проще всего написать программу на Си, используя стандартные функции чтения-записи файлов, потом скомпилять под разные платформы. В 1С просто выгрузить нужные данные в текстовый файл, запустить программу и подождать, пока она создаст файл с результатом - скорость будет очень даже ничего. Кстати, никто не мешает использовать готовые OpenSource решения. А в linux-е оно должно быть в командной строке вообще.
#83 by Torquader
Самое интересное, что если собрать код в несколько строк (а не каждая операция на отдельной строке), то время выполнения существенно сокращается, как ни странно. Так что в что-то есть.
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С