Вверх ↑
Этот топик читают: Гость
Ответов: 127
Рейтинг: 0
#1: 2022-08-07 08:01:42 ЛС | профиль | цитата
Доброго времени суток!
Изучал api одной биржи и столкнулся с проблемой. Сигнатура шифруется в hmac (с этим вопросов нет) и дальше преобразуется в base64. Но "наш" base64 стандартный не подходит.
Вот ссылка на документацию: https://docs.dydx.exchange/#api-key-private-endpoints
В примерах сигнатура 02c23b2b028e53251e615eb1a686e8b3e1ce735b7e0fa3fdf0b45772eb9d1bf9061a7881b83f6a6c26fa9810a9b17f91756f829956e193e04217626e88b34e4e после преобразования получает вид 6nDdDFAfBi2x4BsfRolT-1631f1zXCdar3-o1ifMk6s=
Непонятно
на питоне

sign({
requestPath,
method,
isoTimestamp,
data,
}: {
requestPath: string,
method: RequestMethod,
isoTimestamp: ISO8601,
data?: {},
}): string {
const messageString: string = (
isoTimestamp +
METHOD_ENUM_MAP[method] +
requestPath +
(_.isEmpty(data) ? '' : JSON.stringify(data))
);

return crypto.createHmac(
'sha256',
Buffer.from(this.apiKeyCredentials.secret, 'base64'),
).update(messageString).digest('base64');
}

Редактировалось 4 раз(а), последний 2022-08-07 08:10:23
карма: 0

0
Ответов: 8926
Рейтинг: 823
#2: 2022-08-07 10:15:36 ЛС | профиль | цитата
faniss, у нас есть DataToFileEx https://forum.hiasm.com/getfile/39527 от Galkov, он может читать знаковые целые и с начала и с окончания, посмотрите, может это.
карма: 19

0
Ответов: 127
Рейтинг: 0
#3: 2022-08-07 11:06:06 ЛС | профиль | цитата
Леонид писал(а):
может это.

Не совсем понятно, куда надо впихнуть этот элемент
пример


Add(MainForm,2953706,21,105)
{
Width=893
Height=579
}
Add(Edit,7511588,114,298)
{
Left=30
Top=190
Width=810
TabOrder=5
Text="6nDdDFAfBi2x4BsfRolT-1631f1zXCdar3-o1ifMk6s="
ClearAfterEnter=1
}
Add(Charset,13501613,154,175)
{
Type=5
Point(onError)
link(onCharset,7453268:doText,[(197,181)(197,184)])
link(Text,5077718:Text,[(160,165)(162,165)])
}
Add(Edit,5077718,156,123)
{
Left=25
Top=30
Width=820
TabOrder=5
Text="02c23b2b028e53251e615eb1a686e8b3e1ce735b7e0fa3fdf0b45772eb9d1bf9061a7881b83f6a6c26fa9810a9b17f91756f829956e193e04217626e88b34e4e"
ClearAfterEnter=1
}
Add(Button,3773119,98,175)
{
Left=25
Top=65
Width=60
Caption="to base64"
link(onClick,13501613:doCharset,[])
}
Add(Edit,7453268,208,178)
{
Left=25
Top=95
Width=810
TabOrder=5
Text=""
ClearAfterEnter=1
}
Add(Label,6843172,154,77)
{
Left=30
Top=10
Width=140
Height=17
Caption="текст для преобразования"
}
Add(Label,13436328,116,249)
{
Left=30
Top=170
Width=158
Height=17
Caption="должен получиться этот текст"
}

карма: 0

0
Ответов: 2267
Рейтинг: 676
#4: 2022-08-07 11:47:00 ЛС | профиль | цитата
faniss, не селен в вашем вопросе, но вбил в поиск to base64 online и перейдя по ссылке: https://www.utilities-online.info/base64 получил тот же результат что и выдает ваша схема:


Ещё обратите внимание что в коде питона используется sha256, возможно это и есть решение.

Редактировалось 2 раз(а), последний 2022-08-07 12:19:17
карма: 11

0
Ответов: 127
Рейтинг: 0
#5: 2022-08-07 12:29:16 ЛС | профиль | цитата
sla8a, именно так, стандартный base64 работает отлично. Но должна получиться строка длиной 44 символа (я показал в схеме, что должно получиться)
Про sha256 - там первый текст он уже закодирован в hmac по sha256, можно в расчёт не брать. Там интереснее строка с digest. Знаний не хватает

Редактировалось 1 раз(а), последний 2022-08-07 12:32:25
карма: 0

0
Ответов: 2267
Рейтинг: 676
#6: 2022-08-07 12:37:57 ЛС | профиль | цитата
faniss, а это разве не оно :https://docs-python.ru/standart-library/modul-hmac-python/funktsija-digest-modulja-hmac/
карма: 11

0
Ответов: 127
Рейтинг: 0
#7: 2022-08-07 12:44:30 ЛС | профиль | цитата
sla8a, возможно. Получается, нужен дайджест (что бы это не значило).

Редактировалось 1 раз(а), последний 2022-08-07 13:48:12
карма: 0

0
Ответов: 2267
Рейтинг: 676
#8: 2022-08-07 14:28:50 ЛС | профиль | цитата
faniss, в коде на питоне используется HMAC с хэш-функцией SHA256.
О чем и написано по вышей ссылке:
писал(а):
Secret string used to generate HMACs, not sent with requests.

Так что apiKeyCredentials.secret это не просто BASE64. Вот это вот:
faniss писал(а):
02c23b2b028e53251e615eb1a686e8b3e1ce735b7e0fa3fdf0b45772eb9d1bf9061a7881b83f6a6c26fa9810a9b17f91756f829956e193e04217626e88b34e4e

получено из apiKeyCredentials.secret ?

Редактировалось 1 раз(а), последний 2022-08-07 14:31:47
карма: 11

0
Ответов: 8926
Рейтинг: 823
#9: 2022-08-07 14:57:36 ЛС | профиль | цитата
faniss писал(а):
куда надо впихнуть
Это я тормознул по невнимательности, решил что речь идёт о Int64
карма: 19

0
Ответов: 793
Рейтинг: 168
#10: 2022-08-07 16:04:40 ЛС | профиль | цитата
faniss,
Add(MainForm,14613252,378,224)
{
Width=893
Height=240
}
Add(Edit,11071079,616,322)
{
Left=25
Top=130
Width=810
Font=[Lucida Console,10,0,0,204]
TabOrder=5
Text="6nDdDFAfBi2x4BsfRolT-1631f1zXCdar3-o1ifMk6s="
ClearAfterEnter=1
}
Add(Edit,16415471,511,203)
{
Left=25
Top=30
Width=820
TabOrder=5
Text="Текст сообщения который надо защитить с помощью ключа HMAC"
ClearAfterEnter=1
}
Add(Button,14328699,448,280)
{
Left=25
Top=65
Width=60
Caption="HMAC"
link(onClick,12170737:doString,[])
}
Add(Edit,15051239,616,280)
{
Left=25
Top=95
Width=810
Font=[Lucida Console,10,0,0,204]
TabOrder=5
Text=""
ClearAfterEnter=1
}
Add(Label,14206090,511,126)
{
Left=30
Top=10
Width=140
Height=17
Caption="текст для преобразования"
}
Add(Label,9453130,469,364)
{
Left=30
Top=155
Width=158
Height=17
Caption="должен получиться этот текст"
}
Add(FormatStr,12170737,511,280)
{
Mask="$message = '%1'\r\n$secret = '%2'\r\n\r\n$hmacsha = New-Object System.Security.Cryptography.HMACSHA256\r\n$hmacsha.key = [Text.Encoding]::ASCII.GetBytes($secret)\r\n$signature = $hmacsha.ComputeHash([Text.Encoding]::ASCII.GetBytes($message))\r\n$signature = [Convert]::ToBase64String($signature)\r\n\r\n$signature"
link(onFString,5967528:doConsoleExec,[])
link(Str1,16415471:Text,[])
link(Str2,8365695:Text,[(524,243)(587,243)])
}
Add(WinExec,5967528,567,266)
{
FileName="powershell"
Mode=0
Point(doConsoleExec)
Point(onConsoleResult)
link(onConsoleResult,15051239:doText,[])
}
Add(VisualStrings,8365695,581,210)
{
@Hint=#14:Секретный ключ|
Lines=#10:1234567890|
Width=95
AddHint(91,-61,99,13,@Hint)
}


Редактировалось 1 раз(а), последний 2022-08-07 16:14:35
карма: 16

1
Голосовали:faniss
Ответов: 127
Рейтинг: 0
#11: 2022-08-07 16:46:51 ЛС | профиль | цитата
sla8a писал(а):
faniss, в коде на питоне используется HMAC с хэш-функцией SHA256.

Да, у меня есть этот компонент. HMAC, который шифрует ключём (не могу выложить в открытый доступ по договорённости с автором). Именно уже зашифрованный текст надо в base64 преобразовать. В первом посте писал.

--- Добавлено в 2022-08-07 16:48:35

Gunta, вот это уже интересно) Причём тут и hmac и base64 есть. Но всё ещё получается не то)

с ключами

Add(MainForm,14613252,322,266)
{
Width=893
Height=311
}
Add(Edit,11071079,560,364)
{
Left=25
Top=175
Width=810
Font=[Lucida Console,10,0,0,204]
TabOrder=5
Text="6nDdDFAfBi2x4BsfRolT-1631f1zXCdar3-o1ifMk6s="
ClearAfterEnter=1
}
Add(Edit,16415471,455,245)
{
Left=25
Top=30
Width=820
TabOrder=5
Text="02c23b2b028e53251e615eb1a686e8b3e1ce735b7e0fa3fdf0b45772eb9d1bf9061a7881b83f6a6c26fa9810a9b17f91756f829956e193e04217626e88b34e4e"
ClearAfterEnter=1
}
Add(Button,14328699,392,322)
{
Left=25
Top=65
Width=60
Caption="HMAC"
link(onClick,12170737:doString,[])
}
Add(Edit,15051239,560,322)
{
Left=25
Top=95
Width=810
Font=[Lucida Console,10,0,0,204]
TabOrder=5
Text=""
ClearAfterEnter=1
}
Add(Label,14206090,455,168)
{
Left=30
Top=10
Width=140
Height=17
Caption="текст для преобразования"
}
Add(Label,9453130,413,406)
{
Left=30
Top=155
Width=158
Height=17
Caption="должен получиться этот текст"
}
Add(FormatStr,12170737,455,322)
{
Mask="$message = '%1'\r\n$secret = '%2'\r\n\r\n$hmacsha = New-Object System.Security.Cryptography.HMACSHA256\r\n$hmacsha.key = [Text.Encoding]::ASCII.GetBytes($secret)\r\n$signature = $hmacsha.ComputeHash([Text.Encoding]::ASCII.GetBytes($message))\r\n$signature = [Convert]::ToBase64String($signature)\r\n\r\n$signature"
link(onFString,5967528:doConsoleExec,[])
link(Str1,16415471:Text,[])
link(Str2,8365695:Text,[(468,285)(531,285)])
}
Add(WinExec,5967528,511,308)
{
FileName="powershell"
Mode=0
Point(doConsoleExec)
Point(onConsoleResult)
link(onConsoleResult,15051239:doText,[])
}
Add(VisualStrings,8365695,525,252)
{
@Hint=#14:Секретный ключ|
Lines=#40:B6_eKDmHrm9L-DdVVRU75LC9W_k67TI4tCgoeN5a|
Width=312
AddHint(91,-61,99,13,@Hint)
}


Редактировалось 3 раз(а), последний 2022-08-07 17:48:12
карма: 0

0
Ответов: 793
Рейтинг: 168
#12: 2022-08-07 18:05:31 ЛС | профиль | цитата
faniss писал(а):
Но всё ещё получается не то)

Это не может быть "не то". Это системный HMACSHA256 Class самой Windows.
https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.hmacsha256?redirectedfrom=MSDN&view=net-6.0

Дай пожалуйста ссылку на пример где
faniss писал(а):
сигнатура 02c23b2b028e53251e615eb1a686e8b3e1ce735b7e0fa3fdf0b45772eb9d1bf9061a7881b83f6a6c26fa9810a9b17f91756f829956e193e04217626e88b34e4e после преобразования получает вид 6nDdDFAfBi2x4BsfRolT-1631f1zXCdar3-o1ifMk6s=

карма: 16

0
Ответов: 127
Рейтинг: 0
#13: 2022-08-07 21:11:51 ЛС | профиль | цитата
Gunta писал(а):

ссылку на пример

https://github.com/SixtantIO/dydx-starkware
я тут смотрел. там сигнатура в hmac есть и в header'е запроса base64 тоже есть
тупанул с примером. я там уже зашифрованный текст ещё раз зашифровал твоим кодом. но всё равно не то. откуда там тире у них появились в base64?

Редактировалось 3 раз(а), последний 2022-08-07 21:17:57
карма: 0

0
Ответов: 793
Рейтинг: 168
#14: 2022-08-08 06:35:44 ЛС | профиль | цитата
faniss, В документации по ссылке из твоего первого сообщения написано, что подписываемое сообщение (message) должно состоять из timestamp + method + requestPath + body
А не как не 02c23b2b028e53251e615eb1a686e8b3e1ce735b7e0fa3fdf0b45772eb9d1bf9061a7881b83f6a6c26fa9810a9b17f91756f829956e193e04217626e88b34e4e

A SHA-256 HMAC is created using the API key secret and the message timestamp + method + requestPath + body defined as follows:
• timestamp: The DYDX-TIMESTAMP header, which must be within 30 seconds of the server time.
• method: The name of the HTTP method used, uppercase (e.g. GET).
• requestPath: The API endpoint path, beginning with /v3/.
• body: The HTTP request body (normally empty for GET and DELETE).

faniss писал(а):
откуда там тире у них появились в base64?

Неоткуда им там взяться - https://ru.wikipedia.org/wiki/Base64

Редактировалось 1 раз(а), последний 2022-08-08 06:50:21
карма: 16

0
Ответов: 127
Рейтинг: 0
#15: 2022-08-08 09:44:55 ЛС | профиль | цитата
Gunta писал(а):
должно состоять

Да, ты прав. 6nDdDFAfBi2x4BsfRolT-1631f1zXCdar3-o1ifMk6s= это не base64 от 02c23b2b028e53251e615eb1a686e8b3e1ce735b7e0fa3fdf0b45772eb9d1bf9061a7881b83f6a6c26fa9810a9b17f91756f829956e193e04217626e88b34e4e. Оказалось, что 02c23b2b028e..... уже в base64
Но откуда взялся 6nDdDFAfBi2x4BsfRolT-1631f1zXCdar3-o1ifMk6s= я так и не понял
карма: 0

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)