Имя: Пароль:
1C
1С v8
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 самому.
Или посмотреть, как она коверкает двухбайтовые символы и "выкусить" старший байт.
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс