Хеширование данных с ключом по алгоритму HMAC-SHA1 / HMAC-SHA256 средствами 1С
Алгоритмы;
Привожу пример шифрования по алгоритмам HMAC-SHA1 и HMAC-SHA256 средствами только языка 1С. Данный код найден на просторах интернета, автору огромное спасибо!
Использование данных алгоритмов хеширования часто требуют сторонние веб-приложения при обращении к ним через api.
Процедура КнопкаВыполнитьНажатие(Элемент)
СтрокаДляХеш = ""; // указываем строку для хеширования
КлючДляХеш = ""; // указываем ключ для хеширования
СтруктураРезультата = ВыполнитьШифрование(СтрокаДляХеш,КлючДляХеш);
Сообщить(СтруктураРезультата.ДД);
Сообщить(СтруктураРезультата.HexСтрока); // равносильно результату функции CryptoJS.HmacSHA1(message, secret) на js // или CryptoJS.HmacSHA256
Сообщить(СтруктураРезультата.Base64Строка); // равносильно результату функции CryptoJS.enc.Base64.stringify(CryptoJS.HmacSHA1(message, secret)) на js // или CryptoJS.HmacSHA256
КонецПроцедуры
Функция ВыполнитьШифрование(СтрокаДляХеш,КлючДляХеш)
СтрокаНули = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000";
СтрокаОПАД = "5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c";
СтрокаИПАД = "36363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636";
К = ПолучитьДвоичныеДанныеИзСтроки(КлючДляХеш);
К = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(К);
Нули = ПолучитьБуферДвоичныхДанныхИзHexСтроки(СтрокаНули);
Нули.ЗаписатьПобитовоеИли(0,К);
Шаг1 = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(Нули);
ИПАД = ПолучитьБуферДвоичныхДанныхИзHexСтроки(СтрокаИПАД);
БуферШаг1 = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(Шаг1);
ИПАД.ЗаписатьПобитовоеИсключительноеИли(0,БуферШаг1);
Шаг2 = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(ипад);
БуферШаг2 = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(Шаг2);
БуферТекст = ПолучитьБуферДвоичныхДанныхИзСтроки(СтрокаДляХеш);
БуферШаг3 = БуферШаг2.Соединить(БуферТекст);
Шаг3 = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(БуферШаг3);
ХД = Новый ХешированиеДанных(ХешФункция.SHA1); // Для SHA256 изменить на ХешФункция.SHA256
ХД.Добавить(Шаг3);
Шаг4 = ХД.ХешСумма;
ОПАД = ПолучитьБуферДвоичныхДанныхИзHexСтроки(СтрокаОПАД);
БуферШаг1 = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(Шаг1);
ОПАД.ЗаписатьПобитовоеИсключительноеИли(0,БуферШаг1);
Шаг5 = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(ОПАД);
БуферШаг4 = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(Шаг4);
БуферШаг5 = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(Шаг5);
БуферШаг6 = БуферШаг5.Соединить(БуферШаг4);
Шаг6 = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(БуферШаг6);
ХД = Новый ХешированиеДанных(ХешФункция.SHA1); // Для SHA256 изменить на ХешФункция.SHA256
ХД.Добавить(Шаг6);
Шаг7 = ХД.ХешСумма;
СтруктураРезультата = Новый Структура;
СтруктураРезультата.Вставить("ДД",Шаг7);
СтруктураРезультата.Вставить("HexСтрока",НРег(ПолучитьHexСтрокуИзДвоичныхДанных(Шаг7)));
СтруктураРезультата.Вставить("Base64Строка",Base64Строка(Шаг7));
Возврат СтруктураРезультата;
КонецФункции