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

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

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

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

Лучшие комментарии
1. davdykin 17 21.04.17 21:42 Сейчас в теме
Спасибо за информацию, учитывая популярность микросервисов думаю может вполне пригодиться.
ponkratov; keypax; DrAku1a; +3 Ответить
Остальные комментарии
Избранное Подписка Сортировка: Древо
1. davdykin 17 21.04.17 21:42 Сейчас в теме
Спасибо за информацию, учитывая популярность микросервисов думаю может вполне пригодиться.
ponkratov; keypax; DrAku1a; +3 Ответить
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 1602 17.10.17 10:19 Сейчас в теме
Для MD5 и SHA-1 у вас не верный размер блока, он должен быть 64. Можете проверить в любом онлайн генераторе.
7. keypax 87 18.10.17 10:51 Сейчас в теме
6. pbazeliuk 1602 17.10.17 11:36 Сейчас в теме
И последнее, если ключ больше размера блока, его необходимо предварительно хешировать
8. keypax 87 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 87 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 209 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 87 25.01.19 10:48 Сейчас в теме
(16) К сожалению, у меня нет готового кода, которы бы заменял метод WriteBitwiseXor
18. frkbvfnjh 510 28.01.19 15:21 Сейчас в теме
Выдает ошибку:
Процедура или функция с указанным именем не определена (ValueIsNotFilled)
21. keypax 87 28.01.19 16:42 Сейчас в теме
(18)
Пожалуйста добавьте метод
Function ValueIsNotFilled(Value) Export

	Return Not ValueIsFilled(Value);

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

Вышлю вам последнюю версию в ЛС.
26. frkbvfnjh 510 29.01.19 14:17 Сейчас в теме
(22) Спасибо большое! Теперь все работает.
20. frkbvfnjh 510 28.01.19 15:36 Сейчас в теме
Я так понимаю есть только Encode и Decode и кодирование производится только по алгоритму SHA256. Все верно?
23. keypax 87 28.01.19 17:22 Сейчас в теме
(20) средствами 1С реализован только алгоритм HS256. Для алгоритма RS256 я использовал COM-объект из сторонней библиотеки.
24. frkbvfnjh 510 29.01.19 05:59 Сейчас в теме
(23) Хорошо, но из обработки идет вызов функций которых нет в общих модулях, это сбивает с толку. Тогда переименовали бы в общем модуле функции в функции с префиксом HS256, а для RS256 сделали бы "заглушку" с комментариями. Или переименуйте вызываемые функции в самой обработке, удалите те, которых нет на самом деле. Да и было бы отлично, если привести готовый код для RS256 который вы использовали при работе со сторонней библиотекой, я думаю никто бы не огорчился, а только благодарны были бы. А то начинаешь сомневаться в том правильно ли все понял, отнимает время что бы разобраться что к чему и как правильно пользоваться.
25. frkbvfnjh 510 29.01.19 06:19 Сейчас в теме
В целом публикация хорошая. Написанная Вами библиотека функций очень нужная!
27. frkbvfnjh 510 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 87 14.05.19 11:55 Сейчас в теме
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии


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

Руководитель проектов 1С
Санкт-Петербург
зарплата от 150 000 руб.
Полный день

Программист 1С
Бобров
зарплата от 100 000 руб. до 150 000 руб.
Временный (на проект)

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