0. keypax 93 17.04.17 10:34 Сейчас в теме

Что такое HMAC и JWT и как это использовать в 1С

Лёгкая статья про стандарты HMAC и JWT с небольшой теорией и исходным кодом.

Перейти к публикации

Лучшие комментарии
1. davdykin 18 21.04.17 21:42 Сейчас в теме
Спасибо за информацию, учитывая популярность микросервисов думаю может вполне пригодиться.
stilet; ponkratov; keypax; DrAku1a; +4 Ответить
Остальные комментарии
Избранное Подписка Сортировка: Древо
1. davdykin 18 21.04.17 21:42 Сейчас в теме
Спасибо за информацию, учитывая популярность микросервисов думаю может вполне пригодиться.
stilet; ponkratov; keypax; DrAku1a; +4 Ответить
2. stas1976 14 26.04.17 11:23 Сейчас в теме
3. NcSteel 04.05.17 20:58 Сейчас в теме
Подскажите, пожалуйста, вариацию если в качестве соли используется не строковый ключ, а сертификат
4. user757186 29.06.17 19:49 Сейчас в теме
(3) функции хэширования и подписи работают с двоичными данными, строки - это лишь частный случай двоичных данных. Если вы посмотрите внимательно код - там нет фукнкций работы со строками, там используются функции работы с двоичными данными.
5. pbazeliuk 1708 17.10.17 10:19 Сейчас в теме
Для MD5 и SHA-1 у вас не верный размер блока, он должен быть 64. Можете проверить в любом онлайн генераторе.
7. keypax 93 18.10.17 10:51 Сейчас в теме
6. pbazeliuk 1708 17.10.17 11:36 Сейчас в теме
И последнее, если ключ больше размера блока, его необходимо предварительно хешировать
8. keypax 93 26.10.17 18:11 Сейчас в теме
(6) Обновил код по вашим замечаниям. Благодарю, что нашли ошибки.
9. moro_as 17.02.18 06:31 Сейчас в теме
задача в интеграции с https://docs.veeroute.com/api/examples/json_examples/
есть что-то общее между JWT?
застрял на функции getBytes() какой аналог в 1с (двоичные данные?)
направьте куда копать.
10. keypax 93 18.02.18 09:52 Сейчас в теме
(9) да
в строчке
byte[] passBytes = password.getBytes();

по всей видимости следует использовать глобальный метод ПолучитьДвоичныеДанныеИзСтроки (GetBinaryDataFromString)

Затем вам нужно будет конвертировать массив в двоичные данные
byte[] saltBytes = listToArray(ticket.getSalt());

Для этого вам понадобится объект ЗаписьДанных (DataWriter)
и метод ЗаписатьБайт (WriteByte)

Далее нужно будет соеденить passBytes, saltBytes и вычислить хэш
byte[] PaS = makeBytesHash(concatenateByteArrays(passBytes, saltBytes), "SHA-512");


Для соединения passBytes, saltBytes используйте функцию из статьи
Function BinConcat(Val BinaryData1, Val BinaryData2)


А вот с хэшем беда.
В 1С есть только хэш-функции
CRC32
MD5
SHA1
SHA256

Поэтому ищем в интернете варианты. Например в этой статье есть два подхода для получения SHA-512:
https://infostart.ru/public/175332/

Осталось только полученный хэш конвертировать в массив - для этого используйте объект ЧтениеДанных (DataReader).
11. moro_as 19.02.18 11:29 Сейчас в теме
(10) Спасибо огромное!!!
Затем вам нужно будет конвертировать массив в двоичные данные
byte[] saltBytes = listToArray(ticket.getSalt());

Для этого вам понадобится объект ЗаписьДанных (DataWriter)
и метод ЗаписатьБайт (WriteByte)


Функция listToArray(Знач Массив) Экспорт
	Перем Результат;
	ПотокВПамяти = Новый ПотокВПамяти();
	ЗаписьДанных = Новый ЗаписьДанных(ПотокВПамяти);	
	Для Каждого Элемент из Массив Цикл
		ЗаписьДанных.ЗаписатьБайт(Число(Элемент));
	КонецЦикла;
	Результат = ПотокВПамяти.ЗакрытьИПолучитьДвоичныеДанные();
	Возврат Результат;
КонецФункции
Показать


ЗаписатьБайт выдаёт ошибку:
по причине:
Значение байта должно быть в диапазоне от 0 до 255,
а в передаваемом массиве [-100,-96,20,51,89,-47,-80,-128,86,43,-24,124,-109,12,47] есть элементы с минусовым значением...
12. moro_as 19.02.18 13:29 Сейчас в теме
(11) Оказывается байт java (-127...128), вот и вся ошибка.
13. moro_as 19.02.18 19:11 Сейчас в теме
(10)
Для соединения passBytes, saltBytes используйте функцию из статьи
Function BinConcat(Val BinaryData1, Val BinaryData2)

штатным образом можно получить через СоединитьДвоичныеДанные
14. moro_as 19.02.18 23:10 Сейчас в теме
(10)
А вот с хэшем беда.
В 1С есть только хэш-функции
CRC32
MD5
SHA1
SHA256

Поэтому ищем в интернете варианты. Например в этой статье есть два подхода для получения SHA-512:
https://infostart.ru/public/175332/


Да, действительно беда.
Но можно и вот так попробовать:

Функция CryptoSHA512(Строка) Экспорт 
	Текст = Новый COMОбъект("System.Text.UTF8Encoding");
	КриптоSHA512 = Новый COMОбъект("System.Security.Cryptography.SHA512Managed");
	Байты = Текст.GetBytes_4(Строка); 
	МассивХэш = КриптоSHA512.ComputeHash_2(Байты).Выгрузить();
	Возврат МассивХэш;
КонецФункции
Показать
15. Varsaavius 18.05.18 12:28 Сейчас в теме
При использовании алгоритма RS256, при декодировании постоянно не совпадают сигнатуры. /:
16. pallid 216 16.01.19 10:34 Сейчас в теме
Подскажите есть ли замена платформенного метода Buffer1.WriteBitwiseXor(0, Buffer2, Buffer2.Size) на аналог
Function BinBitwiseXOR(Val BinaryData1, Val BinaryData2)
	
	MemoryStream = New MemoryStream();
	DataWriter = New DataWriter(MemoryStream);
	
	DataReader1 = New DataReader(BinaryData1);
	DataReader2 = New DataReader(BinaryData2);
	
	Buffer1 = DataReader1.ReadIntoBinaryDataBuffer();
	Buffer2 = DataReader2.ReadIntoBinaryDataBuffer();
	
	If Buffer1.Size > Buffer2.Size Then
		Buffer1.WriteBitwiseXor(0, Buffer2, Buffer2.Size);
		DataWriter.WriteBinaryDataBuffer(Buffer1);
	Else 
		Buffer2.WriteBitwiseXor(0, Buffer1, Buffer1.Size);
		DataWriter.WriteBinaryDataBuffer(Buffer2);
	EndIf;
	
	res = MemoryStream.CloseAndGetBinaryData();
	Return res;

EndFunction

Показать
17. keypax 93 25.01.19 10:48 Сейчас в теме
(16) К сожалению, у меня нет готового кода, которы бы заменял метод WriteBitwiseXor
18. frkbvfnjh 558 28.01.19 15:21 Сейчас в теме
Выдает ошибку:
Процедура или функция с указанным именем не определена (ValueIsNotFilled)
21. keypax 93 28.01.19 16:42 Сейчас в теме
(18)
Пожалуйста добавьте метод
Function ValueIsNotFilled(Value) Export

	Return Not ValueIsFilled(Value);

EndFunction
19. frkbvfnjh 558 28.01.19 15:33 Сейчас в теме
Блин капец:
Обработка.HMAC_JWT.Форма.Form.Форма Возможно ошибочный метод: "DecodeHS256"
Обработка.HMAC_JWT.Форма.Form.Форма Возможно ошибочный метод: "DecodeRS256"
Обработка.HMAC_JWT.Форма.Form.Форма Возможно ошибочный метод: "EncodeHS256"
Обработка.HMAC_JWT.Форма.Form.Форма Возможно ошибочный метод: "EncodeRS256"
Нет таких функций!
Вы бы перепроверили все. И раз уж на то пошло, то выкладывали бы сразу все в виде одного файла демонстрационной конфигурации или все функции в обработку засунули, а не кучу разрозненных файлов
22. keypax 93 28.01.19 17:13 Сейчас в теме
(19) код скаченных модулей Cryptography и JWT рабочий.
Демонстрационная обработка использует интерфейс от несколько обновленного модуля JWT.
В связи с этим обновил публикацию - залил последнюю версию модуля JWT.
Прошу прощения за неудобства.

Вышлю вам последнюю версию в ЛС.
26. frkbvfnjh 558 29.01.19 14:17 Сейчас в теме
(22) Спасибо большое! Теперь все работает.
20. frkbvfnjh 558 28.01.19 15:36 Сейчас в теме
Я так понимаю есть только Encode и Decode и кодирование производится только по алгоритму SHA256. Все верно?
23. keypax 93 28.01.19 17:22 Сейчас в теме
(20) средствами 1С реализован только алгоритм HS256. Для алгоритма RS256 я использовал COM-объект из сторонней библиотеки.
24. frkbvfnjh 558 29.01.19 05:59 Сейчас в теме
(23) Хорошо, но из обработки идет вызов функций которых нет в общих модулях, это сбивает с толку. Тогда переименовали бы в общем модуле функции в функции с префиксом HS256, а для RS256 сделали бы "заглушку" с комментариями. Или переименуйте вызываемые функции в самой обработке, удалите те, которых нет на самом деле. Да и было бы отлично, если привести готовый код для RS256 который вы использовали при работе со сторонней библиотекой, я думаю никто бы не огорчился, а только благодарны были бы. А то начинаешь сомневаться в том правильно ли все понял, отнимает время что бы разобраться что к чему и как правильно пользоваться.
38. mcOrk 23.10.19 11:47 Сейчас в теме
А можно получить данную библиотеку? Не получилось найти на просторах интернета. Спасибо.
39. keypax 93 23.10.19 13:13 Сейчас в теме
(38) Да, конечно. В конце статьи есть кнопка "Скачать". Используйте, пожалуйста, её.
40. mcOrk 23.10.19 16:17 Сейчас в теме
(39) CF скачал, но я имел ввиду про стороннюю библиотеку, используемую Вами "AddIn.RSAUtils" Отдельной ссылки нигде не нашел.
41. keypax 93 23.10.19 17:38 Сейчас в теме
(40) по поводу AddIn.RSAUtils - напишите, мне пожалуйста на почту vasily@pintov.ru
25. frkbvfnjh 558 29.01.19 06:19 Сейчас в теме
В целом публикация хорошая. Написанная Вами библиотека функций очень нужная!
27. frkbvfnjh 558 29.01.19 14:18 Сейчас в теме
28. kloze 14.05.19 11:22 Сейчас в теме
Подскажите почему не работает. Сейчас HMAC получаю так

<?php 
$p_sign = hash_hmac('sha1', '811576.003RUB8290666011119https://www.test.ru2014052019110700003430', pack('H*', '3716699F804BE05E9E8D767ACEB6B88E')); 
echo $p_sign  
?>


HMAC = 7a619c6b8f79b95fc359a990075d6aeb2f6a6965

А через эту обработку получает 9E83F1A022F0F916580132CA54639DA576E573BC
29. keypax 93 14.05.19 11:55 Сейчас в теме
30. malikov_pro 157 04.10.19 20:31 Сейчас в теме
А можете ли Вы (автор) сделать реализацию pbkdf2? Тема Вам близка а реализации под 1C не нашел.
31. keypax 93 07.10.19 11:00 Сейчас в теме
(30) Я бы с удовольствием. К сожалению, не понимаю для каких практических задач нужен pbkdf2 в 1С. Например HMAC нужен был для интеграции с Twilio. И чтобы избавится от обращения к COM-объекту был реализован JWT и HMAC средствами платформы.
Для каких реальных задач вы видите необходимость в реализации pbkdf2?
32. malikov_pro 157 07.10.19 11:57 Сейчас в теме
(31)
1. Передача данных для проверки PIN кодов в удаленной системе (сейчас партнер передает Base64 строку с хешем солью и параметрами, из за отсутствия реализации проверяем через его API, сначала планировалось локально).
2. Хранение паролей для внешних пользователей, куча решений когда внешних пользователей хранят как обычных. Я в решениях хранил в отдельном справочнике и по простому хешировал пароль.
33. keypax 93 07.10.19 15:59 Сейчас в теме
(32) По второму кейсу в простого хэша может быть и достаточно.
По первому кейсу конечно нужна реализация pbkdf2.
Не могу обещать, что сделаю в скором времени.
Если руки дойдут – оповещу Вас.
34. maxx 829 14.10.19 09:13 Сейчас в теме
Добрый день! По поводу использования такого стандарта 1С. Если вот такой пример. Пусть надуманный, но недалеко от реального использования.

Есть торговая сеть, состоящая из независимых организаций какого-нибудь торгового бренда, сети. Организации независимые (разные юридическое лица) и имеют свои базу 1С пусть "1С:Управление торговлей", но доработки у каждого свои , учитывающие своим местные особенности, свои программисты.

Так как организации представляют один брэнд, они хотят при отсутствии товару у себя, посмотреть у своих коллег в других регионах. Так как единой общей базы нет, то решили сделать следующее: пользователи баз 1С могут зайти в личный веб-кабинет и там увидеть остатки других организаций в других регионах. Для этого используется технология http-запросов или soap-запросов, при этом конечно в самих базах 1С заведены пользователи только "свои", не чужих регионов.

В своей родной "базе" 1С реализован механизм выдаче токена пользователю для веб-кабинета c правами на просмотр разной информации. Между базами 1С произведен обмен SecretKey. В каждой базе 1С реализовали веб-сервис, который получает Token и уже разобрав токен, понимается какие права данного пользователя, время токена и т.п.

Возможно, такое использование?
35. keypax 93 14.10.19 11:06 Сейчас в теме
(34) Да, отличный пример!

Благодаря JWT нет необходимости всем участникам сети делать в своих базах внешних пользователей.

Я вижу процесс так:
Участник сети выдает веб-кабинету свой SecretKey.
Веб-кабинет с помощью SecretKey делает токен.
Другой участник сети с помощью токена может сходить в базу первого участника сети за остатками.
Первый участник сети по токену и SecretKey может определить выполнять запрос или нет.
Токен не дает перманентный доступ - у него есть срок годности.

Чтобы такую систему запустить нужно всем добавить в свои базы функционал:
1. Генерация SecretKey и отправка его в Веб-кабинет
2. HTTP-сервис, который умеет проверять токены и отдавать остатки
Это можно реализовать через расширение.
Ещё нужно сделать веб-кабинет, который фактически может не иметь веб-интерфейса. Достаточно сделать HTTP-сервис, который умеет принимать SecretKey и выдавать токены.
36. maxx 829 14.10.19 11:28 Сейчас в теме
(35) Один момент, который хотелось бы уточнить, нужно ли передавать веб-кабинету SecretKey, почему SecretKey нельзя передавать между базами 1С просто и там хранить?.

А если веб-кабинет, сделан на чистом js (есть фрейворки сейчас даже таки) с запросами ajax, т.е. весь веб-часть это клиентская часть (т.е. там хранить SecretKey не надо)?

Т.е. выдача токена в базе 1С с помощью SecretKey "базы 1", а в другой базе 1С "базы 2" проверка этого токена с помощью SecretKey, т.е. база1 обменялось с базой2 SecretKey (конечно, если SecretKey по-хорошему для каждой базы 1С надо делать свой, чтобы в случае проблем можно было быстро поменять SecretKey и ранее выданные токены перестали работать).
37. keypax 93 14.10.19 12:51 Сейчас в теме
(36) Можно так сделать как вы описываете, но тогда JWT теряет свой смысл, потому что все смогут бесконтрольно делать токены.
Если токены выдавать централизовано, то можно ограничить количество токенов, чтобы пользователи не злоупотребляли возможностью видеть остатки у других пользователей.
В токене ведь кроме срока его действия можно хоть конкретный код номенклатуры указать.
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Автор новостных обзоров на тему 1С и бухучета
Санкт-Петербург
По совместительству

Ведущий программист 1С
Омск
зарплата от 70 000 руб. до 110 000 руб.
Полный день

Программист 1С
Екатеринбург
зарплата до 120 000 руб.
Полный день

Консультант-аналитик 1С
Рязань
зарплата до 80 000 руб.
Полный день

Программист 1С
Рязань
зарплата от 90 000 руб.
Полный день