HMAC SHA256

The 1C:Enterprise developers forum

#1
People who like this:0Yes/0No
Active user
Rating: 4
Joined: Mar 6, 2018
Company: Bodega LLC

Hello, I need to get hmac sha256 hex encryption. I found a function but when i compared with online calculator results are different. Is there any ready function in 1C? I am using 8.3.23.1688 version.

here is what i found;


// Функция - HMAC
//
// Параметры:                            1
//  K     - ключ    в шестнадцатеричном виде - Строка
//  text - текстовое сообщение - Строка
//  Hash - Hash function (CRC32, MD5, SHA1, SHA256) - Строка
// Возвращаемое значение:
//     строка HMAC - Строка
Функция HMAC(Знач K, Знач text, Знач Hash) export

Перем 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;                                          
КонецФункции

 
#2
People who like this:0Yes/0No
Administrator
Rating: 23
Joined: Oct 3, 2019
Company:

Hello,

in order for this function to work correctly, you need to convert the key to HEX and only then run the HMAC function.

For example, the following code can help you:


Code
Procedure cmdAlgorithm1AtServer()
   
    kKey = "";
    For k = 1 To StrLen(Key) Do
        
        kKey = kKey + ПреобразоватьДесятичнуюСИВHex(CharCode(Mid(Key,k,1)));
        
    EndDo;    
   
    result1 = HMAC(kKey, text, "SHA256");
   
EndProcedure


For verification:

key: 29AWGPV7107B1Z1
text: test text test
result: 7b5290994ee70efa1fc410893218b50f00565d0de5486dc5ec8f0e762edd­b1d6

We can check for example here: https://www.freeformatter.com/hmac-generator.html

result: 7b5290994ee70efa1fc410893218b50f00565d0de5486dc5ec8f0e762edd­b1d6


as you can see the result is identical

 
#3
People who like this:0Yes/0No
Active user
Rating: 4
Joined: Mar 6, 2018
Company: Bodega LLC

Amazing!!! Thank you it is working now :)

 
Subscribe
Users browsing this topic (guests: 1, registered: 0, hidden: 0)
Be the first to know tips & tricks on business application development!

A confirmation e-mail has been sent to the e-mail address you provided .

Click the link in the e-mail to confirm and activate the subscription.