Desktop version

Main > Forum > 1C:Enterprise Platform > 1C:Enterprise – Business applications platform > HMAC SHA256

Forum

Search UsersRules
HMAC SHA256
#1
Active user
Points:: 0
Joined:: Mar 6, 2018

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

Profile
#2
Administrator
Points:: 0
Joined:: Oct 3, 2019

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

Profile
#3
Active user
Points:: 0
Joined:: Mar 6, 2018

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

Profile
Subscribe
Users browsing this topic (guests: 1, registered: 0, hidden: 0)



© 1C LLC. All rights reserved
1C Company respects the privacy of our customers and visitors
to our Web-site.