HMAC на встроенном языке 1С

08.12.17

Разработка - Защита ПО и шифрование

Внешняя обработка хеширования данных HMAC (SHA-1, MD5, SHA-256, CRC-32) без использования внешних компонент.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
HMAC
.epf 8,43Kb ver:1.0
112
112 Скачать (1 SM) Купить за 1 850 руб.

Для получения HMAC в функцию передается первым параметром — ключ K. Второй параметр — сообщение text, которое будет передаваться отправителем и подлинность которого будет проверяться получателем. Третим параметром тип хеш-функции Hash (CRC32, MD5, SHA1, SHA256) . После чего на выходе мы получаем код аутентификации.

// Функция - HMAC
//
// Параметры:                            1
//  K     - ключ    в шестнадцатеричном виде - Строка
//  text - текстовое сообщение - Строка
//  Hash - Hash function (CRC32, MD5, SHA1, SHA256) - Строка
// Возвращаемое значение:
//     строка HMAC - Строка
Функция HMAC(Знач K, Знач text, Знач Hash)
	
	Перем kResult;
	Перем К0;
	
	//Если длина ключа K больше размера блока, то к ключу K применяем хэш-функцию
	Если СтрДлина(K)>128 Тогда 
		K = SHA1(K,Hash);
	КонецЕсли;	
	
	//1 Дополняем ключ K нулевыми байтами до размера блока. Размер блока хэш-функции SHA-1 равен 64 байтам.
	StringSHA1 = Лев(K,128);
	Для к = СтрДлина(K) По 128 Цикл
		StringSHA1 = StringSHA1 + "0";
	КонецЦикла;
	К0 = StringSHA1;
	
	//2 Выполняем операцию «побитовое исключающее ИЛИ» c константой 0x36.
	b = ПреобразоватьЧислоВДвоичнуюСИ(ПреобразоватьHexВДесятичнуюСИ("36"));
	
	к = 1;
	Пока к < 128 Цикл
		a             = ПреобразоватьЧислоВДвоичнуюСИ(ПреобразоватьHexВДесятичнуюСИ(Сред(StringSHA1,к,2)));
		с             = XOR(a,b);        
		StringSHA1     = Лев(StringSHA1,к-1)+с+Прав(StringSHA1, 128-к);
		к             = к + 2;
	КонецЦикла;
	
	StringSHA1 = Лев(StringSHA1,128);
	
	//3 Выполняем склейку исходного сообщения со строкой, полученной на шаге 2.
	Для к = 1 По СтрДлина(text) Цикл
		
		StringSHA1 = StringSHA1 + ПреобразоватьДесятичнуюСИВHex(КодСимвола(Сред(text,к,1)));
		
	КонецЦикла;
	
	//4 Применим хэш-функцию SHA-1 к строке, полученной на прошлом шаге.
	StringSHA1     = SHA1(StringSHA1,Hash);
	kResult     = StringSHA1;
	
	//5 Выполним операцию «побитовое исключающее ИЛИ» c константой 0x5c.
	StringSHA1 = К0;
	
	b = ПреобразоватьЧислоВДвоичнуюСИ(ПреобразоватьHexВДесятичнуюСИ("5c"));
	
	к = 1;
	Пока к < 128 Цикл
		a             = ПреобразоватьЧислоВДвоичнуюСИ(ПреобразоватьHexВДесятичнуюСИ(Сред(StringSHA1,к,2)));
		с             = XOR(a,b);        
		StringSHA1     = Лев(StringSHA1,к-1)+с+Прав(StringSHA1, 128-к);
		к             = к + 2;
	КонецЦикла;
	
	StringSHA1 = Лев(StringSHA1,128);
	
	//6 Склейка строки, полученной на шаге 4, со строкой, полученной на шаге 5.
	StringSHA1 = StringSHA1 + kResult;
	
	//7 Применим хэш-функцию SHA-1 к строке, полученной на прошлом шаге.
	StringSHA1 = SHA1(StringSHA1,Hash);    
	
	Возврат StringSHA1;
	
КонецФункции

Функция SHA1(Знач nString, Hash)    
	Хеширование        = Новый ХешированиеДанных(ХешФункция[Hash]);
	ТипhexBinary    = ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "hexBinary");
	ДвоичныеДанные    = ФабрикаXDTO.Создать(ТипhexBinary,nString);
	Хеширование.Добавить(ДвоичныеДанные.Значение);    
	sign             = Хеширование.ХешСумма;
	sign 			 = СтрЗаменить(НРЕГ(sign), " ", "");
	Возврат СтрЗаменить(НРЕГ(sign), " ", "");
КонецФункции

Функция ПреобразоватьДесятичнуюСИВHex(Знач int)	
	Если int < 256 Тогда 
		Возврат Прав("00" + ПреобразоватьДесятичнуюСИВОднобайтовыйHex(int),2);
	Иначе
		Возврат Прав("0000" + ПреобразоватьДесятичнуюСИВДвухбайтовыйHex(int),4);
	КонецЕсли;                                 	
КонецФункции

Функция ПреобразоватьHexВДесятичнуюСИ(Знач hex)
	simbol     = СтрДлина(hex) - 1;
	dec     = 0;
	i         = 1;
	Пока simbol >= 0 Цикл
		simbolHex     = Сред(hex, i, 1);
		Res         = Найти("0123456789abcdef", simbolHex) - 1;
		dec         = dec + Res * Pow(16, simbol);
		simbol         = simbol - 1;
		i             = i + 1;
	КонецЦикла;   
	Возврат dec;
КонецФункции

Функция ПреобразоватьЧислоВДвоичнуюСИ(Знач int, rBit = 8)
	b = "";
	Для k = 1 По rBit Цикл
		m     = pow(2, rBit - k);
		bit = Цел(int / m);
		int = int - m * bit;
		b     = b + bit;
	КонецЦикла;                                
	Возврат b;                                     
КонецФункции

Функция XOR(a, b)    
	res = 0;
	s     = 1;
	к     = Мин(СтрДлина(a), СтрДлина(b));    
	Пока к > 0 Цикл        
		a1     = Сред(a,к,1);
		b1     = Сред(b,к,1);                     
		res = res + s * ?(a1=b1,0,Макс(a1,b1));
		s     = s*2;        
		к     = к-1;        
	КонецЦикла;     
	Возврат ПреобразоватьДесятичнуюСИВHex(res);
КонецФункции

Функция ПреобразоватьДесятичнуюСИВДвухбайтовыйHex(Знач int)	
	BinaryData = ПреобразоватьЧислоВДвоичнуюСИ(int, 11);	
	BinaryData = "110" + Лев(BinaryData,5) + "10" + Прав(BinaryData, 6);	
	DecimalData = ПолучитьДесятичноеЧислоИзДвоичного(BinaryData);	
	HexData = ПреобразоватьДесятичнуюСИВОднобайтовыйHex(DecimalData);	
	Возврат HexData;                                        	
КонецФункции

Функция ПолучитьДесятичноеЧислоИзДвоичного(b)	
	res 	= 0;
	s     	= 1;
	к     	= СтрДлина(b);
	Пока к > 0 Цикл        
		bit   = Сред(b,к,1);
		res = res + s * bit;
		s   = s*2;        
		к   = к-1;        
	КонецЦикла;                              	
	Возврат res;                             	
КонецФункции

Функция ПреобразоватьДесятичнуюСИВОднобайтовыйHex(Знач int)	
	hex = "";
	Пока int <> 0 Цикл
		p   = int % 16;
		hex = Сред("0123456789abcdef", p + 1, 1) + hex;
		int = Цел(int / 16);
	КонецЦикла;
	Возврат hex;                                           	
КонецФункции

Описпние алгоритма можно посмотреть в Википедии (https://ru.wikipedia.org/wiki/HMAC)

Битовые операции (//infostart.ru/public/99739/)

Преобразование dec to hex и hex to dec https://ru.wikipedia.org/wiki/Позиционная_система_счисления

Представление кириллицы в UTF-8 http://i.voenmeh.ru/kafi5/Kam.loc/inform/UTF-8.htm

 

HMAC HMAC-SHA1 HMAC-MD5 HMAC-SHA256 HMAC-CRC32 HMAC без использования внешних компонет

См. также

Защита ПО и шифрование Программист Платформа 1С v8.3 1С:Бухгалтерия 3.0 Абонемент ($m)

Представляю вам микрорасширение, которое запрещает глобальный поиск по вашей конфигурации.

1 стартмани

09.02.2023    2753    12    aximo    5    

2

Защита ПО и шифрование Программист Абонемент ($m)

Для установки защиты pdf документа, полученного в 1С, написано консольное приложение на c#., использующее одну зависимость pdfSharp.dll. В результате работы приложения ограничены операции над документом и записаны метаданные. С помощью аргументов командной строки можно управлять работой приложения.

2 стартмани

30.01.2023    2164    2    olevlasam    3    

3

Защита ПО и шифрование Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Универсальный синтаксический анализатор ASN.1, который может декодировать любую допустимую структуру ASN.1 DER или BER, независимо от того, закодирована ли она в кодировке Base64 (распознаются необработанные base64, защита PEM и begin-base64) или в шестнадцатеричном кодировании.

1 стартмани

04.12.2022    3599    16    keyn5565`    0    

14

Защита ПО и шифрование Программист Платформа 1С v8.3 Абонемент ($m)

Демонстрация возможностей шифрования строки на основе мастер-пароля в 1С Предприятие 8.3.19. AES без zip файла, RSA, PKDF2. (c использованием библиотеки С# через com).

2 стартмани

31.08.2022    4501    9    vit59    2    

6

Защита ПО и шифрование Программист Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Обработка, позволяющая запутывать и шифровать байт-код, поставлять модули без исходных текстов и т.д. Работает только в файловом варианте с версии платформы 8.3.22.1368 из-за конструктора ГенераторСлучайныхЧисел, поскольку алгоритм был изменён.

10 стартмани

16.06.2022    12853    106    ZhokhovM    12    

45

Защита ПО и шифрование Программист Платформа 1С v7.7 Платформа 1С v8.3 Абонемент ($m)

Как уберечь конструкторскую документацию от воровства конкурентами? Недавно столкнулся с этой проблемой. Заказчик серьёзно обеспокоен утечкой информации о конструкторских разработках в адрес конкурентов, за счет подкупа исполнителей, занимающихся производством по конструкторской документации, операторов технологического оборудования и обрабатывающих центров по изготовлению деталей и сборочных единиц.

2 стартмани

09.03.2022    6163    3    ge_ni    9    

2

Защита ПО и шифрование Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Система построена на веб платформе, все управление происходит на сайте в личном кабинете пользователя.

1 стартмани

27.12.2021    5136    2    idm80    12    

9
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. i_lo 214 02.03.17 03:09 Сейчас в теме
Скопировал код из статьи в обработку. Ввожу ключ - 123, текст - sss, функцию - sha-1 и получаю hmac - da2a7fa2ac3e18892b6d0d24221285fa1030b03d. Разве он не должен быть, как на скриншоте 83е...?
Ввожу ключ - 123456, тест - Вышел зайчик погулять, функцию - sha-1 и получаю:

{ВнешняяОбработка.HMAC.МодульОбъекта(74)}: Ошибка при вызове метода контекста (Создать)
ДвоичныеДанные = ФабрикаXDTO.Создать(ТипhexBinary,nString);
по причине:
Несоответствие типов XDTO
по причине:
Ошибка проверки данных XDTO:
Значение: '24026036363636363636363636363636363636363636363636363636363­636363636363636363636363636363636363636363636363636363636363­63636363641244b44843543b2043743043944743843a2043f43e43b44343­b44f44244c' не соответствует простому типу: {http://www.w3.org/2001/XMLSchema}hexBinary
formica32; +1 Ответить
2. Knup 44 06.03.17 22:48 Сейчас в теме
(1)
Разве он не должен быть, как на скриншоте 83е...?


нет, потому что ключ нужно передавать в шестнадцатеричном виде.

(1)
Ввожу ключ - 123456, тест - Вышел зайчик погулять, функцию - sha-1 и получаю:


Добавил поддержку кирилицы
3. Knup 44 06.03.17 22:48 Сейчас в теме
(1)
Разве он не должен быть, как на скриншоте 83е...?


в файле обработки есть пример
4. Операция1Ы 53 20.03.17 16:09 Сейчас в теме
на 8.2 работать не будет, там нет ХешированиеДанных.
5. Knup 44 22.03.17 01:12 Сейчас в теме
(4) к сожелению, да. Если хеширование sha1, тогда посмотрите http://infostart.ru/public/99739/ готовое решение.
6. user839842 07.10.17 13:58 Сейчас в теме
пробовал реализовать sha256 на приведенном примере. Но хеш получается другой. Нежели генерировать его в online конвертерах. В коде какая-то ошибка ?
user1074814; ginshou; formica32; +3 Ответить
7. Knup 44 23.10.17 20:08 Сейчас в теме
(6) Какой текст и ключ? У меня все работает как часы
8. V_K 03.11.17 13:21 Сейчас в теме
Функция HMAC(Знач K, Знач text, Знач Hash)

А если ключ "K" это строка,а не число. Как его зашифровать в этот параметр?
formica32; +1 Ответить
9. Knup 44 07.11.17 09:53 Сейчас в теме
(8) Вводите строку, все должно работать (:
10. primat 3786 06.12.17 15:17 Сейчас в теме
Владимир, подскажите, пожалуйста, если мне нужно хеширование SHA-384, то получится ли использовать вместо функции SHA1(Знач nString, Hash) из Вашего алгоритма функцию из этого примера? https://1c-programmer-blog.ru/programmirovanie/md5-v-1s.html
Например, ту, что использует библиотеку CAPICOM. Ведь хеширования SHA-384 у 1С нет в платформе, верно?
11. Knup 44 06.12.17 17:52 Сейчас в теме
(10) Да, все будет работать.
И да, хеширования SHA-384 в 1С нет (:
12. sudden 17.12.17 09:46 Сейчас в теме
Помогите пожалуйста.

АПИСекрет = "cEMBFULinI6rzG3mYKL45czc81pjU7BXbwImC1CFNXk";
Сигнатура = "8692c7a03a684765ac5fe04f04dd72c8POSThttps://localhost/api/getopenorders11223311FxOYiYfpMxmANj4kGJzg=="­
хмак = HMAC(АПИСекрет, Сигнатура, "SHA256");

На выходе 224c54567d42c5c3537bc305329694347fba095592094d6e88a2f342e788­ec1e

PHP:
$hmacsignature = base64_encode( hash_hmac("sha256", $signature, base64_decode( $API_SECRET ), true ) );
На выходе: v+YF+qxhVqB95bjKZB7bN7ywpTgoPUleObTmXNoEE2E=

Расскажите что не так?
13. Knup 44 19.12.17 11:01 Сейчас в теме
(12) Судя по всему в коде php у вас не просто получается hmac, а еще использует кодирование информации в 64-разрядный код. В публикации функция просто получает HMAC. Попробуйте получить по этим данным HMAC в онлайн генераторе и 1С. Результат будет одинаковый.
16. sudden 23.12.17 08:50 Сейчас в теме
(13) Все равно не то что-то. Секрет передать в каком виде надо?
АПИСекрет = "cEMBFULinI6rzG3mYKL45czc81pjU7BXbwImC1CFNXk";
Потому что даже убрав base64_encode из ПХП получая по
$hmacsignature = hash_hmac("sha256", $signature, base64_decode( $API_SECRET ), true ) ;
Ответы разные.
Остается только в обработке Первое: base64_decode( $API_SECRET ) и Второе: hash_hmac("sha256",$signature, Результат_Первого), В_Двоичных)
Но даже получив ответ от ПХП не двоичные данные, а в шестнадцатеричной кодировке = Разные.
18. Knup 44 25.12.17 09:37 Сейчас в теме
(16) Сложно сказать основываясь на вашем коде, что именно происходит. Предлагаю вам воспользоватся онлайн генератором https://www.freeformatter.com/hmac-generator.html. Введите туда
АПИСекрет = "cEMBFULinI6rzG3mYKL45czc81pjU7BXbwImC1CFNXk";
Сигнатура = "8692c7a03a684765ac5fe04f04dd72c8POSThttps://localhost/api/getopenorders11223311FxOYiYfpMxmANj4kGJzg=="­­;
и результат у вас получится аналогичный с результатом в 1С,

Повторюсь ищите причину в php, судя по всему там не просто хеширование в hmac
14. lamdth 10 20.12.17 11:30 Сейчас в теме
тоже интересно, можно ли как-то доработать обработку чтобы получить HMAC в Base 64
15. Knup 44 20.12.17 17:17 Сейчас в теме
(14) Конечно можно. Посмотрите на сайте https://infostart.ru/public/all/?st=t&public-filter%5Bsearch%5D=base64, или поищите в интернете. Скорее всего Вашу проблему уже кто-то решал.
17. sudden 23.12.17 08:54 Сейчас в теме
hash_hmac(""sha256"", $signature, $API_SECRET, false )
Даже так разное
19. vl-sher1 43 23.01.18 14:55 Сейчас в теме
Владимир, спасибо за процедуру. Она некорректно работала с кодировкой UTF8, я бы предложил сделать так (8.3):
Функция HMAC(Знач K, Знач text, Знач Hash, Кодировка = null ) Экспорт
	
	Перем kResult;
	Перем К0;
	
	Если Кодировка = null Тогда Кодировка = КодировкаТекста.UTF8; КонецЕсли;
// ...
//3 Выполняем склейку исходного сообщения со строкой, полученной на шаге 2.    БуферДвоичныхДанных
	ДвоичныйТекст = ПолучитьБуферДвоичныхДанныхИзСтроки(text, Кодировка, ложь);
	Для к = 0 По ДвоичныйТекст.Размер - 1 Цикл
		StringSHA1 = StringSHA1 + ПреобразоватьДесятичнуюСИВHex(ДвоичныйТекст[к]);
	КонецЦикла;
Показать


Для проверки удобно использовать https://www.freeformatter.com/hmac-generator.html
38. mashinist 7 04.01.21 00:48 Сейчас в теме
(19)
Что-то у меня ни как не получается...

исходные данные такие
строка ля кодировки "test_merch_n1;1454277600;1454364000"
ключ "flk3409refn54t54t*FNJRET"
метод MD5
и результат должен быть "b9277c081b29841e5eccea03d223e23a"

а обработка выдает "a007f12b26135b8eb95e5b558e2fc67b"

Причем результат один и тот же, что в Вашем варианте, что в оригинальном, хотя в //3 Выполняем склейку исходного сообщения со строкой, полученной на шаге 2. БуферДвоичныхДанных StringSHA1 в Вашем варианте по начальным символам совпадает, но значительно длиннее.
39. Knup 44 06.01.21 12:19 Сейчас в теме
(38)
Все работает. Похоже Вы не в нужном формате передаете. Прочитайте в описании функции есть описание
Прикрепленные файлы:
20. unoDosTres 05.02.18 10:12 Сейчас в теме
Доброго дня! Подскажите ,выложенный в публикации код такой же как и в обработке?
потому что воспользовавшись, кодом из публикации и попытавшись сравнить результат с онлайн генератором предложенным автором, ни разу не получил сходство ни по одному из алгоритмов шифрования. прикрепил файл
Прикрепленные файлы:
21. Knup 44 05.02.18 15:33 Сейчас в теме
(20) День добрый! Код абсолютно идентичный. Проверил, у меня все работает на вашем примере. Посмотрите на описание передаваемых параметров и их формат, Вы точно правильно передаете их? Хочу обратить Ваше внимание на параметр K - ключ, он передается в шестнадцатеричном виде.
unoDosTres; +1 Ответить
22. unoDosTres 05.02.18 15:47 Сейчас в теме
(21),
Т.е. в моем примере на скрине у меня ключ имеет строковое значение "key" я его должен перевести в hex и только после этого запускать функцию hmac?
23. Knup 44 05.02.18 16:09 Сейчас в теме
24. afafaf 26.03.18 16:07 Сейчас в теме
(23) Подскажите, пожалуйста, как именно это сделать (привести строку к hex виду)?
25. Knup 44 27.03.18 09:23 Сейчас в теме
(24)
kKey = "";
	Для к = 1 ПО СтрДлина(Key) Цикл
		
		kKey = kKey + ПреобразоватьДесятичнуюСИВHex(КодСимвола(Сред(Key,к,1)));
		
	КонецЦикла; 
elcoan; SuperSpade; +2 Ответить
31. SuperSpade 07.02.19 11:51 Сейчас в теме
26. afafaf 03.04.18 13:05 Сейчас в теме
А вот мой вариант. Строго в соответствии с алгоритмом из Вики (единственное отличие - предварительно от ключа рассчитывается MD5, это требуется в конкретно моей реализации, можно убрать)
Функция Шмяк(СтрокаТекст,СтрокаКлюч) Экспорт
	
	СтрокаНули = "00000000000000000000000000000000000000000000000000000000000­000000000000000000000000000000000000000000000000000000000000­000000000";
	СтрокаОПАД = "5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5­c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5­c5c5c5c5c";
	СтрокаИПАД = "36363636363636363636363636363636363636363636363636363636363­636363636363636363636363636363636363636363636363636363636363­636363636";
	
	К = ПолучитьДвоичныеДанныеИзСтроки(СтрокаКлюч);
	ХД = Новый ХешированиеДанных(ХешФункция.MD5);
	ХД.Добавить(К);
	Шаг0 = ХД.ХешСумма;
	
	К = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(Шаг0);
	Нули = ПолучитьБуферДвоичныхДанныхИзHexСтроки(СтрокаНули);  	
	Нули.ЗаписатьПобитовоеИли(0,К);         	
	Шаг1 = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(Нули);
	
	ИПАД = ПолучитьБуферДвоичныхДанныхИзHexСтроки(СтрокаИПАД);
	БуферШаг1 = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(Шаг1);
	ИПАД.ЗаписатьПобитовоеИсключительноеИли(0,БуферШаг1);
	Шаг2 = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(ипад);
	
	БуферШаг2 = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(Шаг2);
	БуферТекст = ПолучитьБуферДвоичныхДанныхИзСтроки(СтрокаТекст);
	БуферШаг3 = БуферШаг2.Соединить(БуферТекст);
	Шаг3 = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(БуферШаг3);
	
	ХД = Новый ХешированиеДанных(ХешФункция.SHA1);
	ХД.Добавить(Шаг3);
	Шаг4 = ХД.ХешСумма;
	
	ОПАД = ПолучитьБуферДвоичныхДанныхИзHexСтроки(СтрокаОПАД);
	БуферШаг1 = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(Шаг1);
	ОПАД.ЗаписатьПобитовоеИсключительноеИли(0,БуферШаг1);
	Шаг5 = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(ОПАД);
	
	БуферШаг4 = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(Шаг4);
	БуферШаг5 = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(Шаг5);
	БуферШаг6 = БуферШаг5.Соединить(БуферШаг4);
	Шаг6 = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(БуферШаг6);
	
	ХД = Новый ХешированиеДанных(ХешФункция.SHA1);
	ХД.Добавить(Шаг6);
	Шаг7 = ХД.ХешСумма;
	
	Возврат ПолучитьHexСтрокуИзДвоичныхДанных(Шаг7);  	
	
КонецФункции

Показать
ZeratulAyuris; Dilovar9; +2 Ответить
32. Dilovar9 65 02.06.19 18:13 Сейчас в теме
33. ZeratulAyuris 25.06.19 08:27 Сейчас в теме
(26) спасибо за вариант, но к нему есть дополнение для случаев, когда длина ключа >64 байт:
    Шаг0 = ПолучитьДвоичныеДанныеИзСтроки(СтрокаКлюч);
    Если Шаг0.Размер() > 64 Тогда
        ХД = Новый ХешированиеДанных(ХешФункция.MD5);
        ХД.Добавить(Шаг0);
        Шаг0 = ХД.ХешСумма;
    КонецЕсли;
27. inf012 09.06.18 21:08 Сейчас в теме
Здравствуйте.
Я не понял, SHA-256 работает в 8.3 без использования внешних компонент?
Нужно в мобильное приложение вставить шифрование SHA-256?

Есть примеры кода?
28. Knup 44 13.06.18 09:42 Сейчас в теме
(27)
Здравствуйте!
Есть, есть и даже поддерживает мобильное приложение

Хеширование        = Новый ХешированиеДанных(ХешФункция.SHA256);
Хеширование.Добавить("<Строка для хеш функции>");
SHA256             = Хеширование.ХешСумма;
29. пользователь 13.06.18 14:29
Сообщение было скрыто модератором.
...
30. Юрий-К 113 16.07.18 14:11 Сейчас в теме
Функция - HMAC есть давней в публикации https://infostart.ru/public/458286/
34. Dan1c28 12.09.19 12:39 Сейчас в теме
через MD5 у меня не совпадает hmac :(
35. Dan1c28 12.09.19 13:28 Сейчас в теме
Вызываю вашу функцию,

keyss = "TESTTEST";
Подпись = "6create36850d51d1-5ed7-11e2-8161-001a6411168d11107900000000";

HMAC(keyss, Подпись, "MD5");


В итоге различный хэш, если сгенерировать через сайт hmac hash.
Мой результат: ba60785f34fa7342118a36399be364c3
На сайте: c8c639dc293e0b25459e36e073d33430

Или ваша функция только для sha1 предназначена?
36. Knup 44 13.09.19 10:53 Сейчас в теме
(35) Прочитайте (25) там ответ на ваш вопрос
37. Xershi 1551 19.10.20 16:00 Сейчас в теме
В типовых модуль "РаботаВМоделиСервисаБТС":

#Область Криптография

Функция HMACSHA256(Знач Ключ, Знач Данные)
	
	Возврат HMAC(Ключ, Данные, ХешФункция.SHA256, 64);
	
КонецФункции

Функция Хеш(ДвоичныеДанные, Тип)
	
	Хеширование = Новый ХешированиеДанных(Тип);
	Хеширование.Добавить(ДвоичныеДанные);
	
	Возврат Хеширование.ХешСумма;
		
КонецФункции

Функция HMAC(Знач Ключ, Знач Данные, Тип, РазмерБлока)
	
	Если Ключ.Размер() > РазмерБлока Тогда
		Ключ = Хеш(Ключ, Тип);
	КонецЕсли;
	
	Если Ключ.Размер() < РазмерБлока Тогда
		Ключ = ПолучитьHexСтрокуИзДвоичныхДанных(Ключ);
		Ключ = Лев(Ключ + ПовторитьСтроку("00", РазмерБлока), РазмерБлока * 2);
	КонецЕсли;
	
	Ключ = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзHexСтроки(Ключ));
	
	ipad = ПолучитьБуферДвоичныхДанныхИзHexСтроки(ПовторитьСтроку("36", РазмерБлока));
	opad = ПолучитьБуферДвоичныхДанныхИзHexСтроки(ПовторитьСтроку("5c", РазмерБлока));
	
	ipad.ЗаписатьПобитовоеИсключительноеИли(0, Ключ);
	ikeypad = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(ipad);
	
	opad.ЗаписатьПобитовоеИсключительноеИли(0, Ключ);
	okeypad = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(opad);
	
	Возврат Хеш(СклеитьДвоичныеДанные(okeypad, Хеш(СклеитьДвоичныеДанные(ikeypad, Данные), Тип)), Тип);
	
КонецФункции

Функция СклеитьДвоичныеДанные(ДвоичныеДанные1, ДвоичныеДанные2)
	
	МассивДвоичныхДанных = Новый Массив;
	МассивДвоичныхДанных.Добавить(ДвоичныеДанные1);
	МассивДвоичныхДанных.Добавить(ДвоичныеДанные2);
	
	Возврат СоединитьДвоичныеДанные(МассивДвоичныхДанных);
	
КонецФункции

Функция ПовторитьСтроку(Строка, Количество)
	
	Части = Новый Массив(Количество);
	Для к = 1 По Количество Цикл
		Части.Добавить(Строка);
	КонецЦикла;
	
	Возврат СтрСоединить(Части, "");
	
КонецФункции

#КонецОбласти
Показать
40. user636605_vladzhegest 10.02.21 19:43 Сейчас в теме
Столько статей перерыл, а хеш HMACSHA256 так и не совпал, нормальный хеш здесь:
Функция HMAC_SHA256(СекретныйКлюч, Строка)
	
	Соотв16 = Новый Соответствие;
    Соотв16.Вставить(0 , "0");
    Соотв16.Вставить(1 , "1");
    Соотв16.Вставить(2 , "2");
    Соотв16.Вставить(3 , "3");
    Соотв16.Вставить(4 , "4");
    Соотв16.Вставить(5 , "5");
    Соотв16.Вставить(6 , "6");
    Соотв16.Вставить(7 , "7");
    Соотв16.Вставить(8 , "8");
    Соотв16.Вставить(9 , "9");
    Соотв16.Вставить(10, "a");
    Соотв16.Вставить(11, "b");
    Соотв16.Вставить(12, "c");
    Соотв16.Вставить(13, "d");
    Соотв16.Вставить(14, "e");
    Соотв16.Вставить(15, "f");
		
    Текст = Новый COMОбъект("System.Text.UTF8Encoding"); 
    Криптография = Новый COMОбъект("System.Security.Cryptography.HMACSHA256");

    Если ТипЗнч(СекретныйКлюч) = Тип("Строка") Тогда
        SecKey = Текст.GetBytes_4(СекретныйКлюч);
    Иначе
        SecKey = СекретныйКлюч;
    КонецЕсли;

    Криптография.Key = SecKey;
    ХешБайт = Криптография.ComputeHash_2(Текст.GetBytes_4(Строка));
	
	Хеш = "";
    Для Каждого Байт Из ХешБайт Цикл
        Чс = Цел(Байт/16);
        Хеш = Хеш + Прав("0" + Соотв16.Получить(Чс) + Соотв16.Получить(Байт-Чс*16), 2);
    КонецЦикла;

    Возврат Хеш;
КонецФункции
Показать
user2062292; 4ed; Serg2000mr; user1232351; +4 Ответить
49. user2062292 05.03.24 22:32 Сейчас в теме
41. xvchk 25.02.21 00:51 Сейчас в теме
Всем привет.

Недавно нашел в новом релизе УНФ расчет HMAC-SHA256 полностью на встроенном языке. В общем модуле "РаботаВМоделиСервисаБТС" есть функция

Функция HMACSHA256(Знач Ключ, Знач Данные) Экспорт
	
	Возврат HMAC(Ключ, Данные, ХешФункция.SHA256, 64);
	
КонецФункции


Использовал ее. У меня все совпало. Удачи!
Merkalov; Veric; ZeroSumGame; mrxmljson; Volchock; user1232351; +6 Ответить
42. mrxmljson 05.04.21 15:16 Сейчас в теме
(41)

Спасибо тебе! Долго искал рабочий вариант, уже собирался этот править, так как давал не такой результат.
Чет сам не догадался в типовых посмотреть
43. LessyTheRogue 19.08.21 01:30 Сейчас в теме
Ребята у кого не работает, несмотря на то, что передаёте строку ключа в HEX ...

У вас наверное как и у меня строка ключа хоть и в хексе, но в верхнем регистре! А при преобразовании символы верхнего регистра не на тех же местах что и нижние в таблице символов. Получается что не работает. Либо ключ переведите в нижний или в функцию допишите k = НРЕГ(k)

с вас комментарий если помог. сам просидел часов 5
44. user1074814 23.09.21 03:05 Сейчас в теме
Спасибо огромное за решение!
45. araton 24.11.21 22:57 Сейчас в теме
Вообще не работает с ключами больше 7 символов.
вот за 20 минут накатал рабочую
Функция HmacSHA1(Знач K, Знач text) Экспорт
	//Шаг 1. Дополняем ключ K нулевыми байтами до размера блока. Размер блока хеш-функции SHA-1 равен 64 байтам.
	b = 64;
//	K0 = ПолучитьБуферДвоичныхДанныхИзHexСтроки(K);
	K0 = ПолучитьБуферДвоичныхДанныхИзСтроки(K);	
	
	ipad = Новый БуферДвоичныхДанных(b);
	opad = Новый БуферДвоичныхДанных(b);
	Для n = 0 по b - 1 Цикл
		ipad.Установить(n,54); //0x36
		opad.Установить(n,92); //0x5c
	КонецЦикла;	
	
	Если K0.Размер > b Тогда
		s_ipad = SHA1(K0);
	Иначе	
		Если K0.Размер < b Тогда
			K0 = K0.Соединить(Новый БуферДвоичныхДанных(b-K0.Размер));
		КонецЕсли;	
		
		//Шаг 2. Выполняем операцию «побитовое исключающее ИЛИ» c константой 0x36.
		k_ipad = K0.Скопировать();
		k_ipad.ЗаписатьПобитовоеИсключительноеИли(0,ipad);
		
		//Шаг 3. Выполняем склейку исходного сообщения со строкой, полученной на шаге 2.
		t_ipad = k_ipad.Соединить(ПолучитьБуферДвоичныхДанныхИзСтроки(text));
		
		//Шаг 4. Применим хеш-функцию SHA-1 к строке, полученной на прошлом шаге.
		s_ipad = SHA1(t_ipad);
	КонецЕсли;
	
	//Шаг 5. Выполним операцию «побитовое исключающее ИЛИ» c константой 0x5c
	k_opad = K0.Скопировать();
	k_opad.ЗаписатьПобитовоеИсключительноеИли(0,opad);
	
	//Шаг 6. Склейка строки, полученной на шаге 4, со строкой, полученной на шаге 5.
	t_opad = k_opad.Соединить(s_ipad);
	
	//Шаг 7. Применим хеш-функцию SHA-1 к строке, полученной на прошлом шаге.
	s_opad = SHA1(t_opad);
	
	Возврат ПолучитьBase64СтрокуИзБуфераДвоичныхДанных(s_opad);
	
КонецФункции	

Функция SHA1(Знач БуферДвоичныхДанных)    
	ДвоичныеДанные = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(БуферДвоичныхДанных);	
	Хеширование = Новый ХешированиеДанных(ХешФункция.SHA1);
	Хеширование.Добавить(ДвоичныеДанные);    
	Возврат ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(Хеширование.ХешСумма);
КонецФункции
Показать

Пользуйтесь)
46. dima1c 46 18.08.22 10:36 Сейчас в теме
У меня получилось вот с таким вызовом

	ПодписьДД = РаботаВМоделиСервисаБТС.HMACSHA256(ПолучитьДвоичныеДанныеИзСтроки(Ключ, КодировкаТекста.ANSI, Ложь), ПолучитьДвоичныеДанныеИзСтроки(текст));
	Подпись = ПолучитьHexСтрокуИзДвоичныхДанных(ПодписьДД);

Потратил некоторое время пока не получилось )))
Merkalov; Veric; +2 Ответить
47. kembrik 10 20.11.23 11:02 Сейчас в теме
Я смотрю тема всплывает периодически

А HMAC для sha512 реализовывал кто без ВК на 1c?
48. kembrik 10 20.11.23 15:16 Сейчас в теме
(47) Сам спросил, сам отвечу. По аналогии с РаботаВМоделиСервисаБТС.HMACSHA256 вполне себе работает данный код

Функция HMACSHA512(Знач Ключ, Знач Данные) Экспорт
	
	Возврат HMAC(Ключ, Данные, ХешФункция.SHA512, 128);
	
КонецФункции
50. andrey_462 2 11.06.24 15:54 Сейчас в теме
Для MD5 но по аналогии и с другими работает


Функция HMACMD5(Знач Ключ, Знач Данные) Экспорт

Возврат HMAC(Ключ, Данные, ХешФункция.MD5, 64);

КонецФункции

Функция HMAC(Знач Ключ, Знач Данные, Тип, РазмерБлока)

Если Ключ.Размер() > РазмерБлока Тогда
Ключ = Хеш(Ключ, Тип);
КонецЕсли;

Если Ключ.Размер() < РазмерБлока Тогда
Ключ = ПолучитьHexСтрокуИзДвоичныхДанных(Ключ);
Ключ = Лев(Ключ + ПовторитьСтроку("00", РазмерБлока), РазмерБлока * 2);
КонецЕсли;

Ключ = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзHexСтроки(Ключ));

ipad = ПолучитьБуферДвоичныхДанныхИзHexСтроки(ПовторитьСтроку("36", РазмерБлока));
opad = ПолучитьБуферДвоичныхДанныхИзHexСтроки(ПовторитьСтроку("5c", РазмерБлока));

ipad.ЗаписатьПобитовоеИсключительноеИли(0, Ключ);
ikeypad = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(ipad);

opad.ЗаписатьПобитовоеИсключительноеИли(0, Ключ);
okeypad = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(opad);

Возврат Хеш(СклеитьДвоичныеДанные(okeypad, Хеш(СклеитьДвоичныеДанные(ikeypad, Данные), Тип)), Тип);

КонецФункции

Функция Хеш(ДвоичныеДанные, Тип)

Хеширование = Новый ХешированиеДанных(Тип);
Хеширование.Добавить(ДвоичныеДанные);

Возврат Хеширование.ХешСумма;

КонецФункции


Функция СклеитьДвоичныеДанные(ДвоичныеДанные1, ДвоичныеДанные2)

МассивДвоичныхДанных = Новый Массив;
МассивДвоичныхДанных.Добавить(ДвоичныеДанные1);
МассивДвоичныхДанных.Добавить(ДвоичныеДанные2);

Возврат СоединитьДвоичныеДанные(МассивДвоичныхДанных);

КонецФункции

Функция ПовторитьСтроку(Строка, Количество)

Части = Новый Массив(Количество);
Для к = 1 По Количество Цикл
Части.Добавить(Строка);
КонецЦикла;

Возврат СтрСоединить(Части, "");

КонецФункции
51. andrey_462 2 13.06.24 18:19 Сейчас в теме
Использовать вышепредоставленный код так

ПодписьДД = HMACMD5(ПолучитьДвоичныеДанныеИзСтроки(Ключ, КодировкаТекста.ANSI, Ложь), ПолучитьДвоичныеДанныеИзСтроки(текст));
Подпись = ПолучитьHexСтрокуИзДвоичныхДанных(ПодписьДД);
Оставьте свое сообщение