Имя: Пароль:
1C
 
Перевод кода с JavaScript/Python на 1С
0 mzelensky
 
25.11.19
09:07
Доброго времени суток!
Имеется вот такой код реализованный на JavaScript (есть тоже самое на Python):

<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/hmac-sha256.js"></script>;
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/enc-base64-min.js"></script>;

var challengeResponse = CreateChallengeResponse(secretKey, challenge);

function CreateChallengeResponse(secretKey, challenge)
{
var secretKeyArr = base64url_decode(secretKey);
var challengeArr = base64url_decode(challenge);
var challengeResponse = CryptoJS.HmacSHA256(challengeArr, secretKeyArr);
return base64url_encode(challengeResponse);
}

function base64url_encode(arg)
{
var s = CryptoJS.enc.Base64.stringify(arg);
s = s.split('=')[0];
s = s.replace(/\+/g, '-');
s = s.replace(/\//g, '_');
return s;
}

function base64url_decode(arg)
{
var s = arg;
s = s.replace(/-/g, '+');
s = s.replace(/_/g, '/');
switch (s.length % 4)
  {
   case 0: break;
   case 2: s += "=="; break;
   case 3: s += "="; break;
   default: console.log("Illegal base64url string!");
  }
return CryptoJS.enc.Base64.parse(s);
}

Его суть - получить на выходе "challengeResponse" через функцию "CreateChallengeResponse". На входе принимается значение 2 переменных "secretKey" и "challenge" - это строки.

Задача - сделать точно тоже самое на 1С (т.е. при одинаковых входных параметрах получать одинаковое выходное значение). В целом я понимаю что тут написано, но все-равно встало 2 проблемы:

1) Функция "function base64url_decode(arg)" - здесь происходит декодирование переданного значения методом "Base64". В 1С есть аналогичный функционал, но почему-то получаются совершенно разные результаты. Даже если взять значение входящей переменной и декодировать его через ОнЛайн декодер Base64, то получается НЕ тоже самое, что возвращает эта функция. В чем может быть особенность?

2) Функция "function CreateChallengeResponse(secretKey, challenge)", а в ней "var challengeResponse = CryptoJS.HmacSHA256(challengeArr, secretKeyArr);" - получение хеш функции методом SHA256. В 1С есть встроенная функция хеширования, но там нельзя подать на вход пару значений, как это сделано здесь. Грубо говоря, я не понимаю, почему и для чего вот тут "CryptoJS.HmacSHA256(challengeArr, secretKeyArr)" передается 2 переменные. Как дальше по ним происходит взятие хеш функции и как это сделать через встроенную функцию 1С?
1 ДенисЧ
 
25.11.19
09:09
2. открой описание этой функции и почитай, что это за параметры и зачем нужны.
2 mzelensky
 
25.11.19
09:19
(1) Одно из описаний:

"Процесс HMAC смешивает секретный ключ с данными сообщения, хэширует результат с помощью хэш-функции, применяет хэш-значение с секретным ключом еще раз, а затем применяет хэш-функцию второй раз"

А вот еще:

CryptoJS.SHA256(str) :: {String}
Crypt a string using a SHA256 algorithm
{String} str The given string to crypt
return {String} The crypted string


CryptoJS.HmacSHA256(str, secretKey) :: {String}
Crypt a string using a Hmac256 algorithm and a secret key
{String} str The given string to crypt
{String} secretKey The secret key used for encryption
return {String} The crypted string

Получается, что имеется 2 варианта расчета SHA256. Первый по одному входящему значению и второй - по двум входящим значениям.
3 mzelensky
 
25.11.19
09:21
(2) В 1С есть типовая функция ,через которую можно сделать так:

ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.SHA256);
ХешированиеДанных.Добавить("Некий текст");                
ЗначениеСуммы = ХешированиеДанных.ХешСумма;

Вопрос - можно ли через нее реализовать вариант "CryptoJS.HmacSHA256(str, secretKey)" ?
4 1С Ассенизатор ПРОФ
 
25.11.19
09:25
(3) Дак это оно и есть вроде.
5 mzelensky
 
25.11.19
09:28
(4) Как туда подать 2 значения ? Так

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

?
6 mzelensky
 
25.11.19
11:17
ап
7 pechkin
 
25.11.19
11:19
криптографии в платформе нет.
поэтому не провернешь
8 Garykom
 
гуру
25.11.19
11:42
(0) Найми уже программиста
9 Cyberhawk
 
25.11.19
11:47
Сколько платят за решение вопроса?
10 mzelensky
 
25.11.19
11:48
(8) А сколько ты хочешь за решение этого вопроса?
11 mzelensky
 
25.11.19
11:48
(9) А сколько ты хочешь за решение этого вопроса?
12 Garykom
 
гуру
25.11.19
11:51
13 Garykom
 
гуру
25.11.19
11:51
(10) Мне сейчас некогда такой хренью заниматься простейшей
14 Cyberhawk
 
25.11.19
11:54
(11) Я не продаю, а интересуюсь
15 mzelensky
 
25.11.19
11:54
(13)  Чего тогда вылез? Занимайся дальше "хренью НЕ простейшей"
16 mzelensky
 
25.11.19
12:01
(12) За это спасибо, попробую.
17 ttk
 
25.11.19
12:25
(0) оставь все как есть на джабаскрипт и вызывай из 1с
18 mzelensky
 
25.11.19
12:41
(17) Ругается на подключение этих модулей:

<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/hmac-sha256.js"></script>;;
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/enc-base64-min.js"></script>;;

Пытался перенести в один листинг, но с "наскоку" как-то не вышло
19 arsik
 
гуру
25.11.19
12:43
А на питоне? Там должно быть попроще.
20 mzelensky
 
25.11.19
12:48
(19) По сути смысл тот же. Тоже вызов "готовых" функций кодирования\декодирования и хеширования.

Разница в том, что для питона компилятор нужен.
21 ttk
 
25.11.19
15:09
(18) как то так работает
&НаКлиенте
Процедура ПриОткрытии(Отказ)
            
        ЭтаФорма.xHTML="<!doctype html>
|<html>
|<head>
|    <meta charset=""utf-8"">
|    <title>1C</title>
//|    <meta http-equiv='X-UA-Compatible' content='IE=Edge'>
|<script type=""text/javascript"" src=""https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/hmac-sha256.js""></script>;
|<script type=""text/javascript"" src=""https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/enc-base64-min.js""></script>;
|</head>
|<p id=""reslt"">123</p>
|<script>
|secretKey = ""secretKey"";
|challenge = ""challenge"";
|var challengeResponse = CreateChallengeResponse(secretKey, challenge);
|function CreateChallengeResponse(secretKey, challenge)
|{
|var secretKeyArr = base64url_decode(secretKey);
|var challengeArr = base64url_decode(challenge);
|var challengeResponse = CryptoJS.HmacSHA256(challengeArr, secretKeyArr);
|return base64url_encode(challengeResponse);
|}
|function base64url_encode(arg)
|{
|var s = CryptoJS.enc.Base64.stringify(arg);
|s = s.split('=')[0];
|s = s.replace(/\+/g, '-');
|s = s.replace(/\//g, '_');
|return s;
|}
|function base64url_decode(arg)
|{
|var s = arg;
|s = s.replace(/-/g, '+');
|s = s.replace(/_/g, '/');
|switch (s.length % 4)
|  {
|   case 0: break;
|   case 2: s += ""==""; break;
|   case 3: s += ""=""; break;
|    default: break;
//|   default: console.log(""Illegal base64url string!"");
|  }
|return CryptoJS.enc.Base64.parse(s);
|}
|var elem = document.getElementById(""reslt"");
|      elem.innerHTML = challengeResponse;
|</script>
|</body>
|</html>";
КонецПроцедуры

&НаКлиенте
Процедура xHTMLДокументСформирован(Элемент)
    Сообщить(Элементы.xHTML.Документ.getElementById("reslt").innerHTML);
КонецПроцедуры
22 ttk
 
25.11.19
15:10
кстати, ";" после</script>, движок мисты сам подставил
23 mzelensky
 
26.11.19
11:48
(21) Спасибо, попробую