Хеширование данных с ключом по алгоритму SHA-1 штатными средствами 1С

Программирование - Практика программирования

SHA-1 ХешФункция ХешированиеДанных ХешФункция.SHA1 Хеширование данных с ключом SHA-1 в 1с

12
Расчет хеш суммы данных по алгоритму SHA-1 с ключом штатными средствами 1С.

Потребовалось реализовать обмен данными с веб-сервером, одним из теребованием авторизации было хеширование данных с секретным ключом.

Пример реализации расчета хеш суммы данных по алгоритму SHA-1 с ключом штатными средствами 1С.

 

//Функция ХэшированиеШтатныеСредства(СтрокаJSON, Base64JSON ,КлючХешированияДанных = "")

//
//Описание:
// Реализует инкрементальный расчет хеш-суммы по добавленным данным, использую хеш функцию SHA1.
//
//Параметры:
// СтрокаJSON - Строка. Строка в формате JSON.
//
// КлючХешированияДанных - Строка. Закодированные данные идентификатора в base64.
//
// Возвращаемое значение:
// Строка. Закодированная хеш сумма в base64.
//
Функция ХэшированиеШтатныеСредства(СтрокаJSON, КлючХешированияДанных = "")

Base64JSON = ЗакодироватьВBase64(СтрокаJSON);

ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.SHA1);
ХешированиеДанных.Добавить(base64Значение(КлючХешированияДанных));
ХешированиеДанных.Добавить(base64Значение(Base64JSON));

ТипДвоичныеДанные = ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "base64Binary");
ДвоичныеДанные = ФабрикаXDTO.Создать(ТипДвоичныеДанные,ХешированиеДанных.ХешСумма);

Возврат ДвоичныеДанные.ЛексическоеЗначение;

КонецФункции
Функция ЗакодироватьВBase64(СтрокаДанных) 

ИмяФайлаЗаписьТекст = ПолучитьИмяВременногоФайла(); 

ЗаписьТекста = Новый ЗаписьТекста(ИмяФайлаЗаписьТекст); 
ЗаписьТекста.ЗаписатьСтроку(СтрокаДанных); 
ЗаписьТекста.Закрыть(); 

ДвДанны = Новый ДвоичныеДанные(ИмяФайлаЗаписьТекст); 

Возврат base64Строка(ДвДанны); 

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

См. также

Комментарии
Избранное Подписка Сортировка: Древо
1. bulpi 131 28.05.14 12:29 Сейчас в теме
В слове "ключ" мягкий знак не нужен :)
2. ZaPaSoff 28.05.14 21:47 Сейчас в теме
что такое ЗакодироватьВBase64(СтрокаJSON)?
3. dour-dead 218 29.05.14 09:22 Сейчас в теме
(2) ZaPaSoff, В моем варианте это


<pre style="color: blue; overflow: auto;">
<span style="color: green;">// кодируем данные в base64, возможно переделать на штатные средства</span>
<span style="color: red;">Функция</span> ЗакодироватьВBase64<span style="color: red;">(</span>Данные<span style="color: red;">)</span>

СтрокаДанных <span style="color: red;">=</span> Строка<span style="color: red;">(</span>Данные<span style="color: red;">)</span><span style="color: red;">;</span>

WSH <span style="color: red;">=</span> <span style="color: red;">Новый</span> COMОбъект<span style="color: red;">(</span><span style="color: black;">"MSScriptControl.ScriptControl"</span><span style="color: red;">)</span><span style="color: red;">;</span>
WSH<span style="color: red;">.</span>language <span style="color: red;">=</span> <span style="color: black;">"JScript"</span><span style="color: red;">;</span>

лКодbase64encode <span style="color: red;">=</span> <span style="color: black;">"</span>
<span style="color: black;"> |function encode(input) {</span>
<span style="color: black;"> | var output = '';</span>
<span style="color: black;"> | var chr1, chr2, chr3, enc1, enc2, enc3, enc4;</span>
<span style="color: black;"> | var i = 0;</span>
<span style="color: black;"> | var _keyStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456­789+/=';</span>
<span style="color: black;"> | input = _utf8_encode(input);</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | while (i < input.length) {</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | chr1 = input.charCodeAt(i++);</span>
<span style="color: black;"> | chr2 = input.charCodeAt(i++);</span>
<span style="color: black;"> | chr3 = input.charCodeAt(i++);</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | enc1 = chr1 >> 2;</span>
<span style="color: black;"> | enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);</span>
<span style="color: black;"> | enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);</span>
<span style="color: black;"> | enc4 = chr3 & 63;</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | if (isNaN(chr2)) {</span>
<span style="color: black;"> | enc3 = enc4 = 64;</span>
<span style="color: black;"> | } else if (isNaN(chr3)) {</span>
<span style="color: black;"> | enc4 = 64;</span>
<span style="color: black;"> | }</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | output = output +</span>
<span style="color: black;"> | _keyStr.charAt(enc1) + _keyStr.charAt(enc2) +</span>
<span style="color: black;"> | _keyStr.charAt(enc3) + _keyStr.charAt(enc4);</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | }</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | return output;</span>
<span style="color: black;"> |}</span>
<span style="color: black;"> |</span>
<span style="color: black;"> |// public method for decoding</span>
<span style="color: black;"> |function decode(input) {</span>
<span style="color: black;"> | var _keyStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456­789+/=';</span>
<span style="color: black;"> | var output = '';</span>
<span style="color: black;"> | var chr1, chr2, chr3;</span>
<span style="color: black;"> | var enc1, enc2, enc3, enc4;</span>
<span style="color: black;"> | var i = 0;</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | input = input.replace(/[^A-Za-z0-9\+\/\=]/g, '');</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | while (i < input.length) {</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | enc1 = _keyStr.indexOf(input.charAt(i++));</span>
<span style="color: black;"> | enc2 = _keyStr.indexOf(input.charAt(i++));</span>
<span style="color: black;"> | enc3 = _keyStr.indexOf(input.charAt(i++));</span>
<span style="color: black;"> | enc4 = _keyStr.indexOf(input.charAt(i++));</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | chr1 = (enc1 << 2) | (enc2 >> 4);</span>
<span style="color: black;"> | chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);</span>
<span style="color: black;"> | chr3 = ((enc3 & 3) << 6) | enc4;</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | output = output + String.fromCharCode(chr1);</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | if (enc3 != 64) {</span>
<span style="color: black;"> | output = output + String.fromCharCode(chr2);</span>
<span style="color: black;"> | }</span>
<span style="color: black;"> | if (enc4 != 64) {</span>
<span style="color: black;"> | output = output + String.fromCharCode(chr3);</span>
<span style="color: black;"> | }</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | }</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | output = _utf8_decode(output);</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | return output;</span>
<span style="color: black;"> |</span>
<span style="color: black;"> |}</span>
<span style="color: black;"> |</span>
<span style="color: black;"> |// private method for UTF-8 encoding</span>
<span style="color: black;"> |function _utf8_encode (string) {</span>
<span style="color: black;"> | var _keyStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456­789+/=';</span>
<span style="color: black;"> | string = string.replace(/\r\n/g,'\n');</span>
<span style="color: black;"> | var utftext = '';</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | for (var n = 0; n < string.length; n++) {</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | var c = string.charCodeAt(n);</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | if (c < 128) {</span>
<span style="color: black;"> | utftext += String.fromCharCode©;</span>
<span style="color: black;"> | }</span>
<span style="color: black;"> | else if((c > 127) && (c < 2048)) {</span>
<span style="color: black;"> | utftext += String.fromCharCode((c >> 6) | 192);</span>
<span style="color: black;"> | utftext += String.fromCharCode((c & 63) | 128);</span>
<span style="color: black;"> | }</span>
<span style="color: black;"> | else {</span>
<span style="color: black;"> | utftext += String.fromCharCode((c >> 12) | 224);</span>
<span style="color: black;"> | utftext += String.fromCharCode(((c >> 6) & 63) | 128);</span>
<span style="color: black;"> | utftext += String.fromCharCode((c & 63) | 128);</span>
<span style="color: black;"> | }</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | }</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | return utftext;</span>
<span style="color: black;"> |}</span>
<span style="color: black;"> |</span>
<span style="color: black;"> |// private method for UTF-8 decoding</span>
<span style="color: black;"> |function _utf8_decode(utftext) {</span>
<span style="color: black;"> | var _keyStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456­789+/=';</span>
<span style="color: black;"> | var string = '';</span>
<span style="color: black;"> | var i = 0;</span>
<span style="color: black;"> | var c = c1 = c2 = 0;</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | while ( i < utftext.length ) {</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | c = utftext.charCodeAt(i);</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | if (c < 128) {</span>
<span style="color: black;"> | string += String.fromCharCode©;</span>
<span style="color: black;"> | i++;</span>
<span style="color: black;"> | }</span>
<span style="color: black;"> | else if((c > 191) && (c < 224)) {</span>
<span style="color: black;"> | c2 = utftext.charCodeAt(i+1);</span>
<span style="color: black;"> | string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));</span>
<span style="color: black;"> | i += 2;</span>
<span style="color: black;"> | }</span>
<span style="color: black;"> | else {</span>
<span style="color: black;"> | c2 = utftext.charCodeAt(i+1);</span>
<span style="color: black;"> | c3 = utftext.charCodeAt(i+2);</span>
<span style="color: black;"> | string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));</span>
<span style="color: black;"> | i += 3;</span>
<span style="color: black;"> | }</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | }</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | return string;</span>
<span style="color: black;"> |}"</span><span style="color: red;">;</span>

лКодbase64encode <span style="color: red;">=</span> СтрЗаменить<span style="color: red;">(</span>лКодbase64encode<span style="color: red;">,</span><span style="color: black;">"'"</span><span style="color: red;">,</span>Символ<span style="color: red;">(</span><span style="color: black;">34</span><span style="color: red;">)</span><span style="color: red;">)</span><span style="color: red;">;</span>
WSH<span style="color: red;">.</span>AddCode<span style="color: red;">(</span>лКодbase64encode<span style="color: red;">)</span><span style="color: red;">;</span>

Рез1 <span style="color: red;">=</span> WSH<span style="color: red;">.</span>Run<span style="color: red;">(</span><span style="color: black;">"encode"</span><span style="color: red;">,</span>СтрокаДанных<span style="color: red;">)</span><span style="color: red;">;</span>

<span style="color: red;">Возврат</span> Рез1<span style="color: red;">;</span>

<span style="color: red;">КонецФункции</span>

</pre>
4. dour-dead 218 29.05.14 09:23 Сейчас в теме
(2) ZaPaSoff,

<pre style="color: blue; overflow: auto;">
<span style="color: green;">// кодируем данные в base64, возможно переделать на штатные средства</span>
<span style="color: red;">Функция</span> ЗакодироватьВBase64<span style="color: red;">(</span>Данные<span style="color: red;">)</span>

СтрокаДанных <span style="color: red;">=</span> Строка<span style="color: red;">(</span>Данные<span style="color: red;">)</span><span style="color: red;">;</span>

WSH <span style="color: red;">=</span> <span style="color: red;">Новый</span> COMОбъект<span style="color: red;">(</span><span style="color: black;">"MSScriptControl.ScriptControl"</span><span style="color: red;">)</span><span style="color: red;">;</span>
WSH<span style="color: red;">.</span>language <span style="color: red;">=</span> <span style="color: black;">"JScript"</span><span style="color: red;">;</span>

лКодbase64encode <span style="color: red;">=</span> <span style="color: black;">"</span>
<span style="color: black;"> |function encode(input) {</span>
<span style="color: black;"> | var output = '';</span>
<span style="color: black;"> | var chr1, chr2, chr3, enc1, enc2, enc3, enc4;</span>
<span style="color: black;"> | var i = 0;</span>
<span style="color: black;"> | var _keyStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456­789+/=';</span>
<span style="color: black;"> | input = _utf8_encode(input);</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | while (i < input.length) {</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | chr1 = input.charCodeAt(i++);</span>
<span style="color: black;"> | chr2 = input.charCodeAt(i++);</span>
<span style="color: black;"> | chr3 = input.charCodeAt(i++);</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | enc1 = chr1 >> 2;</span>
<span style="color: black;"> | enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);</span>
<span style="color: black;"> | enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);</span>
<span style="color: black;"> | enc4 = chr3 & 63;</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | if (isNaN(chr2)) {</span>
<span style="color: black;"> | enc3 = enc4 = 64;</span>
<span style="color: black;"> | } else if (isNaN(chr3)) {</span>
<span style="color: black;"> | enc4 = 64;</span>
<span style="color: black;"> | }</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | output = output +</span>
<span style="color: black;"> | _keyStr.charAt(enc1) + _keyStr.charAt(enc2) +</span>
<span style="color: black;"> | _keyStr.charAt(enc3) + _keyStr.charAt(enc4);</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | }</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | return output;</span>
<span style="color: black;"> |}</span>
<span style="color: black;"> |</span>
<span style="color: black;"> |// public method for decoding</span>
<span style="color: black;"> |function decode(input) {</span>
<span style="color: black;"> | var _keyStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456­789+/=';</span>
<span style="color: black;"> | var output = '';</span>
<span style="color: black;"> | var chr1, chr2, chr3;</span>
<span style="color: black;"> | var enc1, enc2, enc3, enc4;</span>
<span style="color: black;"> | var i = 0;</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | input = input.replace(/[^A-Za-z0-9\+\/\=]/g, '');</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | while (i < input.length) {</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | enc1 = _keyStr.indexOf(input.charAt(i++));</span>
<span style="color: black;"> | enc2 = _keyStr.indexOf(input.charAt(i++));</span>
<span style="color: black;"> | enc3 = _keyStr.indexOf(input.charAt(i++));</span>
<span style="color: black;"> | enc4 = _keyStr.indexOf(input.charAt(i++));</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | chr1 = (enc1 << 2) | (enc2 >> 4);</span>
<span style="color: black;"> | chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);</span>
<span style="color: black;"> | chr3 = ((enc3 & 3) << 6) | enc4;</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | output = output + String.fromCharCode(chr1);</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | if (enc3 != 64) {</span>
<span style="color: black;"> | output = output + String.fromCharCode(chr2);</span>
<span style="color: black;"> | }</span>
<span style="color: black;"> | if (enc4 != 64) {</span>
<span style="color: black;"> | output = output + String.fromCharCode(chr3);</span>
<span style="color: black;"> | }</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | }</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | output = _utf8_decode(output);</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | return output;</span>
<span style="color: black;"> |</span>
<span style="color: black;"> |}</span>
<span style="color: black;"> |</span>
<span style="color: black;"> |// private method for UTF-8 encoding</span>
<span style="color: black;"> |function _utf8_encode (string) {</span>
<span style="color: black;"> | var _keyStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456­789+/=';</span>
<span style="color: black;"> | string = string.replace(/\r\n/g,'\n');</span>
<span style="color: black;"> | var utftext = '';</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | for (var n = 0; n < string.length; n++) {</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | var c = string.charCodeAt(n);</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | if (c < 128) {</span>
<span style="color: black;"> | utftext += String.fromCharCode©;</span>
<span style="color: black;"> | }</span>
<span style="color: black;"> | else if((c > 127) && (c < 2048)) {</span>
<span style="color: black;"> | utftext += String.fromCharCode((c >> 6) | 192);</span>
<span style="color: black;"> | utftext += String.fromCharCode((c & 63) | 128);</span>
<span style="color: black;"> | }</span>
<span style="color: black;"> | else {</span>
<span style="color: black;"> | utftext += String.fromCharCode((c >> 12) | 224);</span>
<span style="color: black;"> | utftext += String.fromCharCode(((c >> 6) & 63) | 128);</span>
<span style="color: black;"> | utftext += String.fromCharCode((c & 63) | 128);</span>
<span style="color: black;"> | }</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | }</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | return utftext;</span>
<span style="color: black;"> |}</span>
<span style="color: black;"> |</span>
<span style="color: black;"> |// private method for UTF-8 decoding</span>
<span style="color: black;"> |function _utf8_decode(utftext) {</span>
<span style="color: black;"> | var _keyStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456­789+/=';</span>
<span style="color: black;"> | var string = '';</span>
<span style="color: black;"> | var i = 0;</span>
<span style="color: black;"> | var c = c1 = c2 = 0;</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | while ( i < utftext.length ) {</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | c = utftext.charCodeAt(i);</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | if (c < 128) {</span>
<span style="color: black;"> | string += String.fromCharCode©;</span>
<span style="color: black;"> | i++;</span>
<span style="color: black;"> | }</span>
<span style="color: black;"> | else if((c > 191) && (c < 224)) {</span>
<span style="color: black;"> | c2 = utftext.charCodeAt(i+1);</span>
<span style="color: black;"> | string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));</span>
<span style="color: black;"> | i += 2;</span>
<span style="color: black;"> | }</span>
<span style="color: black;"> | else {</span>
<span style="color: black;"> | c2 = utftext.charCodeAt(i+1);</span>
<span style="color: black;"> | c3 = utftext.charCodeAt(i+2);</span>
<span style="color: black;"> | string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));</span>
<span style="color: black;"> | i += 3;</span>
<span style="color: black;"> | }</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | }</span>
<span style="color: black;"> |</span>
<span style="color: black;"> | return string;</span>
<span style="color: black;"> |}"</span><span style="color: red;">;</span>

лКодbase64encode <span style="color: red;">=</span> СтрЗаменить<span style="color: red;">(</span>лКодbase64encode<span style="color: red;">,</span><span style="color: black;">"'"</span><span style="color: red;">,</span>Символ<span style="color: red;">(</span><span style="color: black;">34</span><span style="color: red;">)</span><span style="color: red;">)</span><span style="color: red;">;</span>
WSH<span style="color: red;">.</span>AddCode<span style="color: red;">(</span>лКодbase64encode<span style="color: red;">)</span><span style="color: red;">;</span>

Рез1 <span style="color: red;">=</span> WSH<span style="color: red;">.</span>Run<span style="color: red;">(</span><span style="color: black;">"encode"</span><span style="color: red;">,</span>СтрокаДанных<span style="color: red;">)</span><span style="color: red;">;</span>

<span style="color: red;">Возврат</span> Рез1<span style="color: red;">;</span>

<span style="color: red;">КонецФункции</span>

</pre>
5. dour-dead 218 29.05.14 09:24 Сейчас в теме
что то битрикс съедает часть текста)
Прикрепленные файлы:
ЗакодироватьВBase64.txt
6. ZaPaSoff 29.05.14 09:38 Сейчас в теме
Очень интересный вариант. Но в идеале конечно лучше сделать штатными средствами.
7. dour-dead 218 29.05.14 14:31 Сейчас в теме
(6) ZaPaSoff, такое возможно и штатными средствами
8. dour-dead 218 29.05.14 14:33 Сейчас в теме
Вот как пример

Функция ПолучитьBase64ИзСтроки(СтрокаДанных)
	
	ИмяФайлаЗаписьТекст = ПолучитьИмяВременногоФайла();
	
	ЗаписьТекста = Новый ЗаписьТекста(ИмяФайлаЗаписьТекст);
	ЗаписьТекста.ЗаписатьСтроку(СтрокаДанных);
	ЗаписьТекста.Закрыть();
	
	ДвДанны = Новый ДвоичныеДанные(ИмяФайлаЗаписьТекст);
	
	Возврат base64Строка(ДвДанны);
	
КонецФункции
Показать
9. Negator 05.03.18 09:00 Сейчас в теме
Здравствуйте.

Пытаюсь закодировать Json следующего содержания:
{"inputString":"Тест"}
ключом:
123456

Должно получиться (и получается при кодировке различных онлайн кодировщиков):
Dm0Oj8p9SCPeYojkxrtos2mMn9s=
а вместо этого описанная выше функция вообще отказывается работать пока ключ тоже не пропустишь через "ЗакодироватьВBase64", а после этого выдает результат:
zV8nNDDkrNW69zP/sdYCcucUdHU=

Подскажите пожалуйста как получить верный результат.
10. dour-dead 218 06.03.18 12:27 Сейчас в теме
(9)Добрый день. Скорее всего необходимо использовать одинаковые входные данные, что бы получить одинаковый результат на выходе.
12. han_kdz 11 19.03.18 15:16 Сейчас в теме
(9) (11)
та же история
Если делать ХЕШ по 1 строке - все совпадает с онлайн
Если делать по строке + ключ, не совпадает
Если найдено решение, прошу сообщить
Второй день, как рыба об лед (((
13. Negator 28.03.18 09:06 Сейчас в теме
(12)Штатными средствами получить верный результат не получилось. С использованием внешних же компонентов удалось добиться верного результата следующим образом:
Функция ВычислитьНаСервереХешСтрокиПоАлгоритму_HMAC_SHA1(Строка, Ключ, ВернутьBase64 = Истина) Экспорт
    
    Текст = Новый COMОбъект("System.Text.UTF8Encoding");
    КриптоSHA1 = Новый COMОбъект("System.Security.Cryptography.HMACSHA1");
    КриптоSHA1.key = Текст.GetBytes_4(Ключ);
    Если ВернутьBase64 Тогда
        
        Хэш1 = КриптоSHA1.ComputeHash_2(Текст.GetBytes_4(Строка)).Выгрузить();
        СтрокаХэша = Преобразовать64(, Хэш1);
        
    Иначе    
        
        Хэш1 = КриптоSHA1.ComputeHash_2(Текст.GetBytes_4(Строка));
        оStr = Новый COMОбъект("System.Text.StringBuilder");
        Для Каждого стр Из Хэш1 Цикл
            оStr.AppendFormat("{0:x02}", стр);
        КонецЦикла;

        СтрокаХэша = оStr.ToString; //последовательность байтов
        
    КонецЕсли;
        
    Возврат СтрокаХэша;
    
КонецФункции

Функция Преобразовать64(Строка64 = неопределено, Массив64 = неопределено)
    Таб64 = Новый ТаблицаЗначений;
    Таб64.Колонки.Добавить("Код");
    Таб64.Колонки.Добавить("Символ");
    Нпп = 0;
    Для Код = КодСимвола("A") По КодСимвола("Z") Цикл
        стр = Таб64.Добавить();
        стр.Код = Нпп;
        стр.Символ = Символ(Код);
        Нпп = Нпп + 1;
    КонецЦикла;
    Для Код = КодСимвола("a") По КодСимвола("z") Цикл
        стр = Таб64.Добавить();
        стр.Код = Нпп;
        стр.Символ = Символ(Код);
        Нпп = Нпп + 1;
    КонецЦикла;
    стр = Таб64.Добавить();
    стр.Код = Нпп;
    стр.Символ = "0";
    Нпп = Нпп + 1;
    Для Код = 1 По 9 Цикл
        стр = Таб64.Добавить();
        стр.Код = Нпп;
        стр.Символ = Формат(Код,"ЧЦ=1; ЧДЦ=0");
        Нпп = Нпп + 1;
    КонецЦикла;
    стр = Таб64.Добавить();
    стр.Код = Нпп;
    стр.Символ = "+";
    Нпп = Нпп + 1;
    стр = Таб64.Добавить();
    стр.Код = Нпп;
    стр.Символ = "/";
    
    Если Массив64 = неопределено Тогда 
        Если Строка64 = неопределено Тогда
            Сообщить("неверный вызов функции");
            Возврат неопределено;
        КонецЕсли;
        //Уберем переносы строк
        Строка64 = СтрЗаменить(Строка64, Символ(10), "");
        Строка64 = СтрЗаменить(Строка64, Символ(13), "");
        
        //преобразовываем строку в массив
        Если СтрДлина(Строка64) % 4 <> 0 Тогда
            Сообщить("длина строки на входе должна быть кратна 4"); 
            Сообщить(СтрДлина(Строка64)); 
            Возврат неопределено;
        КонецЕсли;
        Кол4 = Цел(СтрДлина(Строка64) / 4);
        РазмерМ = Кол4 * 3;
        Если Прав(Строка64, 2) = "==" Тогда
            РазмерМ = РазмерМ - 2;
        ИначеЕсли Прав(Строка64, 1) = "=" Тогда
            РазмерМ = РазмерМ - 1;
        КонецЕсли;            
        Массив64 = Новый Массив(РазмерМ);
        Для А = 1 По Кол4 Цикл
            Число3 = 0;
            Для Б = 1 По 4 Цикл
                Буква1 = Сред(Строка64, (А-1)*4 + Б, 1);    
                Если Буква1 = "=" Тогда
                    Код4 = 0;
                Иначе
                    стрН = Таб64.Найти(Буква1, "Символ");
                    Если стрН = Неопределено Тогда
                        Сообщить("ошибка при поиске "+ КодСимвола(Буква1));    
                    Иначе 
                        Код4 = стрН.Код;
                    КонецЕсли;
                КонецЕсли;
                Число3 = Число3 * 64 + Код4;
            КонецЦикла;
            Ост = Число3 % 256;
            Индекс = (А-1)*3 + 2;
            Если Индекс <= РазмерМ - 1 Тогда
                Массив64[Индекс] = Ост;
            КонецЕсли;
            Число3 = (Число3 - Ост) / 256;
            Ост = Число3 % 256;
            Индекс = (А-1)*3 + 1;
            Если Индекс <= РазмерМ - 1 Тогда
                Массив64[Индекс] = Ост;
            КонецЕсли;
            Число3 = (Число3 - Ост) / 256;
            Ост = Число3 % 256;
            Массив64[(А-1)*3 + 0] = Ост;
        КонецЦикла;
        Возврат Массив64;
    Иначе //Преобразовываем массив в строку
        Строка64 = "";
        Кол3 = Цел(Массив64.Количество() / 3);
        Если Массив64.Количество() % 3 <> 0 Тогда
            Кол3 = Кол3 + 1;
        КонецЕсли;
        Для А = 1 По Кол3 Цикл
            Число3 = Массив64[(А-1)*3];    
            Если (А-1)*3+1 <= Массив64.ВГраница() Тогда
                Код3 = Массив64[(А-1)*3+1];
            Иначе
                Код3 = 0;
            КонецЕсли;
            Число3 = Число3*256 + Код3;
            Если (А-1)*3+2 <= Массив64.ВГраница() Тогда
                Код3 = Массив64[(А-1)*3+2];
            Иначе
                Код3 = 0;
            КонецЕсли;
            Число3 = Число3*256 + Код3;
            
            Ост4 = Число3 % 64;
            Число3 = (Число3 - Ост4) / 64;
            Ост3 = Число3 % 64;
            Число3 = (Число3 - Ост3) / 64;
            Ост2 = Число3 % 64;
            Число3 = (Число3 - Ост2) / 64;
            Ост1 = Число3 % 64;
            Число3 = (Число3 - Ост1) / 64;
            стрН = Таб64.Найти(Ост1, "Код");
            Если стрН = неопределено Тогда
                Сообщить("Ошибка при поиске");
            Иначе
                Строка64 = Строка64 + стрН.Символ;
            КонецЕсли;
            стрН = Таб64.Найти(Ост2, "Код");
            Если стрН = неопределено Тогда
                Сообщить("Ошибка при поиске");
            Иначе
                Строка64 = Строка64 + стрН.Символ;
            КонецЕсли;
            стрН = Таб64.Найти(Ост3, "Код");
            Если стрН = неопределено Тогда
                Сообщить("Ошибка при поиске");
            Иначе
                Строка64 = Строка64 + стрН.Символ;
            КонецЕсли;
            стрН = Таб64.Найти(Ост4, "Код");
            Если стрН = неопределено Тогда
                Сообщить("Ошибка при поиске");
            Иначе
                Строка64 = Строка64 + стрН.Символ;
            КонецЕсли;
        КонецЦикла;
        //Если количество символов не делится на 3, то на конце должны быть
        //знаки "="
        Если Массив64.Количество() % 3 = 1 Тогда
            Строка64 = Лев(Строка64, СтрДлина(Строка64)-2)+ "==";    
        ИначеЕсли Массив64.Количество() % 3 = 2 Тогда
            Строка64 = Лев(Строка64, СтрДлина(Строка64)-1)+ "=";    
        КонецЕсли;
        Возврат Строка64;
    КонецЕсли;
КонецФункции
Показать
11. Negator 06.03.18 15:10 Сейчас в теме
Входящие данные идентичны - проверено например тут: https://hash.online-convert.com/ru/sha1-generator
14. Negator 26.06.18 10:42 Сейчас в теме
После долгих мытарств решение было найдено (не мое, но работает):
Функция ЗашифроватьSHA1ШтатнымиСредствами(СтрокаТекст,СтрокаКлюч) Экспорт
  
    СтрокаНули = "00000000000000000000000000000000000000000000000000000000000­000000000000000000000000000000000000000000000000000000000000­000000000";
    СтрокаОПАД = "5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5­c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5­c5c5c5c5c";
    СтрокаИПАД = "36363636363636363636363636363636363636363636363636363636363­636363636363636363636363636363636363636363636363636363636363­636363636";
    
    К = ПолучитьДвоичныеДанныеИзСтроки(СтрокаКлюч);
    
    К = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(К);
    Нули = ПолучитьБуферДвоичныхДанныхИз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));      
    
КонецФункции
Показать


Если нужна другая функция хеширования - меняем в двух строчках ХешФункция.SHA1 на нужную и все.
Оставьте свое сообщение