gifts2017

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

Опубликовал {ÐƦǑƝȊ} mx (dour-dead) в раздел Программирование - Практика программирования

Расчет хеш суммы данных по алгоритму 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Строка(ДвДанны); 

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

См. также

Подписаться Добавить вознаграждение

Комментарии

1. bulpi bulpi (bulpi) 28.05.14 12:29
В слове "ключ" мягкий знак не нужен :)
2. Pavel Zakharov (ZaPaSoff) 28.05.14 21:47
что такое ЗакодироватьВBase64(СтрокаJSON)?
3. {ÐƦǑƝȊ} mx (dour-dead) 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. {ÐƦǑƝȊ} mx (dour-dead) 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. {ÐƦǑƝȊ} mx (dour-dead) 29.05.14 09:24
что то битрикс съедает часть текста)
Прикрепленные файлы:
ЗакодироватьВBase64.txt
6. Pavel Zakharov (ZaPaSoff) 29.05.14 09:38
Очень интересный вариант. Но в идеале конечно лучше сделать штатными средствами.
7. {ÐƦǑƝȊ} mx (dour-dead) 29.05.14 14:31
(6) ZaPaSoff, такое возможно и штатными средствами
8. {ÐƦǑƝȊ} mx (dour-dead) 29.05.14 14:33
Вот как пример

Функция ПолучитьBase64ИзСтроки(СтрокаДанных)

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

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

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

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

КонецФункции
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа