|
1C-фукция Base64Строка() работает? | ☑ | ||
---|---|---|---|---|
0
sintez1234
17.10.14
✎
19:56
|
Стоит задача, зашифровать строку, передаваемую на сервер тремя алгоритмами. Маюсь давно уже, 2 алгоритма из трех реализовал уже.
Надо зашифровать и подписать через SHA1, SHA515 и Base64 Во всем мне помогает PHP-сырцы, где уже все есть. Мне надо с PHP перевести на 1С, чтобы больше не нужно было ставить на ПК юзеров PHP-сервер. Остался самый последний штрих! Многомесячной работы! :) Последняя проблема! В PHP такая строка: $auth = base64_encode($accessKey.':'. $hash), И это работает. В 1С у меня уже попадают правильные $accessKey и $hash. Я пробую вот так, но это не работает, возращает вообще пустую строку, 1С-код: Аут = Base64Строка(ХешЗапрос); Как видим, параметр Base64Строка принимает только один, потому и не работает. Пробовал уже через запятую ей второй вставить - ругается так: Слишком много фактических параметров (Base64Строка) В синтакс-помошнике так: Глобальный контекст (Global context) Base64Строка (Base64String) Синтаксис: Base64Строка(<Значение>) Параметры: <Значение> (обязательный) Тип: ДвоичныеДанные. Двоичные данные, которые необходимо закодировать по алгоритму base64. Т.е. сразу видно что проблемы как минимум две: 1) У меня строка, а функция Base64Строка принимает ДвоичныеДанные. Как переделать строку в двоичные данные средствами 1с я не знаю. 2) Во-вторых, сильно я сомневаюсь что без ключа вообще получится правильный результат, а ключ функция не принимает в принципе. С двумя другими алгоритмами шифрования задовница была еще больше, средствами чисто 1с никак, использовал виндовые библиотеки. Видимо с Base64 придется поступить похожим образом. Функция ЗашифроватьSHA1(Строка, СекретныйКлюч) Экспорт Текст = Новый COMОбъект("System.Text.UTF8Encoding"); Криптография = Новый COMОбъект("System.Security.Cryptography.HMACSHA1"); Криптография.Key = Текст.GetBytes_4(СекретныйКлюч); ХешБайт = Криптография.ComputeHash_2(Текст.GetBytes_4(Строка)).Выгрузить(); HTML = Новый COMОбъект("htmlfile"); HTML.Open("text/html"); HTML.Write("<script>ПреобразоватьСтроку = function(x,y){return x.toString(y?y:16)}</script>"); ЯваСкрипт = HTML.documentElement.document.Script; Хеш = ""; Для Каждого Байт Из ХешБайт Цикл Символ = ЯваСкрипт.ПреобразоватьСтроку(Байт); Хеш = Хеш + ?(СтрДлина(Символ) = 2, Символ, "0"+Символ); КонецЦикла; Возврат Хеш; КонецФункции Возможно нужно написать похожую на эту функцию. Я нашел в реестре что-то похожее на нужное. Есть вот эти две интересны штуки: 1) HKEY_CLASSES_ROOT\System.Security.Cryptography.ToBase64Transform 2) HKEY_CLASSES_ROOT\System.Security.Cryptography.FromBase64Transform Из названия понятно что они делают. Как юзать не понятно, примут ли они ключ, тоже не понятно. Короче была у меня мечта сегодня закончить многомесячный труд, но видимо не сбыться ей :( |
|||
1
sintez1234
17.10.14
✎
19:57
|
не SHA515, а SHA512. Опечатка. Впрочем не важно, оно то работает уже.
|
|||
2
Рэйв
17.10.14
✎
19:58
|
(0)Сдается мне все это нахрен никому не нужно, кроме начальника, у которого параноя.
|
|||
3
Рэйв
17.10.14
✎
19:59
|
+(2)Я бы даже уточнил. Мания преследования.
|
|||
4
Рэйв
17.10.14
✎
20:06
|
(0)Извини за вопрос. Что ты там делаешь?
|
|||
5
sintez1234
17.10.14
✎
20:09
|
(4) эта штука подключается к биржам, и фигачит там сделки. Да, на голой 1С без приблуд. Сейчас только PHP-сервер иногда юзаем, но вот-вот и он станет не нужен. Биржевые боты на 1с, страшное изощрение, но работает.
|
|||
6
sintez1234
17.10.14
✎
20:10
|
(4) биржи принимают только вот так зашифрованные запросы. Т.е. неадекватного начальства тут нет. Это реально надо :(
|
|||
7
sintez1234
17.10.14
✎
20:15
|
Нагуглил только одну тему по теме во всем рунете :(
Вот v8: Нужно MD5 и SHA1 Полистал и помереть хочется :( |
|||
8
sintez1234
17.10.14
✎
20:19
|
БЛИИИИИИИИИИИИН!!! ))))))))))
Так там не надо ключа то!!! Это жо строка голимая! base64_encode($accessKey.':'. $hash), Это одна строка там! Типа такая: Строка = "123123:d-9g08df08gdf98gd9f8g"; |
|||
9
sintez1234
17.10.14
✎
20:24
|
Тогда остается другой вопрос, как теперь преобразовать обычную строку в ДвоичныеДанные 1С? Ведь Base64Строка принимает только их, строки не понимает.
|
|||
10
wertyu
17.10.14
✎
20:28
|
(0) >>> Как переделать строку в двоичные данные средствами 1с
ИмяВременногоФайла = ПолучитьИмяВременногоФайла(); ЗаписьТекста = Новый ЗаписьТекста(ИмяВременногоФайла); ЗаписьТекста.Записать(ТвояСтрока); ЗаписьТекста.Закрыть(); ТвояСтрокаДвоичныеДанные = Новый ДвоичныеДанные(ИмяВременногоФайла); |
|||
11
Рэйв
17.10.14
✎
20:34
|
Биржи и 1С....
А я то думал не доживу до конца света. Спасибо,Господи! |
|||
12
wertyu
17.10.14
✎
20:35
|
(11) ты так говоришь, как-будто биржи это нечто запредельное
|
|||
13
Рэйв
17.10.14
✎
20:36
|
(12)Да нет. Просто оно с 1с все равно что кефир с солеными огурцами.
|
|||
14
Рэйв
17.10.14
✎
20:37
|
поотдельности вкусно
|
|||
15
sintez1234
17.10.14
✎
20:49
|
(10) пробую! :)
|
|||
16
sintez1234
17.10.14
✎
20:51
|
(10) так-с... вроде строка похожа на нужную вышла. Проверяю сейчас все ли правильно
|
|||
17
sintez1234
17.10.14
✎
20:53
|
(10) не, что-то не так. Строка очень похожая, но отличается от того что выдает PHP, разбираюсь почему, может в другом совсем ошибка.
|
|||
18
sintez1234
17.10.14
✎
20:55
|
(10) опаньки! :)
Строка которую PHP дает, то что надо: ZWMyYjVjMmQtZjhkMS00ZTRmLWFiMDMtMDBmYWI4MjA0NzU4OjRjYzkxMmNkMmJkMThjNDUzYTRiNWMxNmY4OGFjNzFhNzg0NGQzNjY= Строка которую дает твой код: 77u/ZWMyYjVjMmQtZjhkMS00ZTRmLWFiMDMtMDBmYWI4MjA0NzU4OjRjYzkxMmNk MmJkMThjNDUzYTRiNWMxNmY4OGFjNzFhNzg0NGQzNjY= Как видим разница только в том, что в начале 4 символа, которые можно просто обрезать функцией Прав(). Напишу скоро получилось ли всё как надо :) |
|||
19
sintez1234
17.10.14
✎
20:59
|
Жесть.... Сервер:
401 Unauthorized - invalid hash length Ладно хоть Base64 строчка теперь правильная есть. Буду дальше курить что опять серверу не нравится, че у него длинное там опять. (10) Тебе спасибо огромное :) |
|||
20
sintez1234
17.10.14
✎
21:04
|
Оказалось что итоговая строка не только содержит 4 не нужных мне символа в начале, но и почему то есть символ перевода строки. Я его убрал так:
ИмяВременногоФайла = ПолучитьИмяВременногоФайла(); ЗаписьТекста = Новый ЗаписьТекста(ИмяВременногоФайла); ЗаписьТекста.Записать(АутСтрока); ЗаписьТекста.Закрыть(); Аут2 = Новый ДвоичныеДанные(ИмяВременногоФайла); Аут = Base64Строка(Аут2); Аут = СтрЗаменить(Аут, "77u/", ""); Аут = СтрЗаменить(Аут, Символы.ПС, ""); Ругань на длинну исчезла. Теперь новая ошибка :) Ну ладно, прогресс то есть, когда-нибудь ошибки закончатся... может даже в этом году ) Во что пишет, фиг знает что надо: Request unsuccessful. Incapsula incident ID: 0-82421556293668197 |
|||
21
sintez1234
17.10.14
✎
21:36
|
Ну вообще охренеть, я 1С-кой под анти DDoS фильтр попал... случится же такое...
|
|||
22
Torquader
17.10.14
✎
23:20
|
Строка должна иметь кодировку.
в php все строки однобайтовые, но символы кодируются через UTF-8, а в 1С 8.Х строки двухбайтовые. Соответственно, получается, что для Base64 строки будут совершенно разные. Если уж очень-очень хочется победить, тем более, что символы в ключе и Hash наверняка латинские, то можно написать преобразование в Base64 самому. Или посмотреть, как она коверкает двухбайтовые символы и "выкусить" старший байт. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |