|
Перевод кода с 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) Спасибо, попробую
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |