Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 03.03.2018
Сообщений: 6
1
Delphi 6-7

Sign и хеширование sha512 для биржи krake

17.03.2018, 22:39. Показов 2084. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Уважаемые форумчане. Третий день не могу победить хэш и авторизоваться на бирже kraken.
Биржа выдает ошибку: {"error":["EAPI:Invalid signature"]}
перепробовал миллион вариантов... пока никак.
краткое тз от биржи:

API-Key = API key
API-Sign = Message signature using HMAC-SHA512 of (URI path + SHA256(nonce + POST data)) and base64 decoded secret API key

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
...
 
nonce := '&nonce=' + IntToStr(noncei);
param:=nonce;
api_opt := TStringList.Create;
  api_opt.add(nonce);
 
 SecKey:='BUz6bsCTeXXXXFcThU2VkelQ7 / qm0OTjY / 0UTFdy29mXXXD1Il9tmKV11Ki7CC + ZQ + AxXaVT3CIfnNM3hw ==';
 
sh256:='https://api.kraken.com/0/private/Balance'+SHA256DigestToHex(CalcHMAC_SHA256(SecKey,param));
   sign := SHA512DigestToHex(CalcHMAC_SHA512(SecKey, sh256));
 
 
 form1.IdHTTP1 := TIdHTTP.Create();
 form1.IdHTTP1.ReadTimeout := 10000;
 form1.IdHTTP1.Request.CustomHeaders.AddValue('API-Key', 'NyKUzrXXXTRr6A3EjiieQxSX1J6NeUcfE2widL4CFKF0vZ7TC0P');
 form1.IdHTTP1.Request.CustomHeaders.AddValue('API-Sign', sign);
 form1.IdHTTP1.Request.UserAgent:='Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36';
 
 form1.IdHTTP1.Request.Host:='';
 
 try
 //https://api.kraken.com/0/private/Balance
 
form1.Memo1.Text:=form1.IdHTTP1.Post('https://api.kraken.com/0/private/Balance',api_opt);
 Except
  on Exception do form1.Memo1.Lines.Text:= form1.idHttp1.Response.RawHeaders.GetText ;
 
end;
 
...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.03.2018, 22:39
Ответы с готовыми решениями:

Хеширование SHA512
У меня есть пароль, к нему добавляю соль и перец. Получается такая строка - соль+пароль+перец....

Описать функцию Sign(X) целого типа, возвращающую для вещественного числа X следующие значения и найти значения выражения Sign(A) + Sign(B)
Описать функцию Sign(X) целого типа, возвращающую для вещественного числа X следующие значения:...

Вычислить Z=(sign(x)+sign(y))∙sign(x+y), где -функция определения знака числа, принимающая значение 1, если число а- положительное; -1, если число
Вычислить Z=(sign(x)+sign(y))∙sign(x+y), где -функция определения знака числа, принимающая...

Определить значение z = sign x + sign у
Определить значение z = sign x + sign у, где -1 при а < 0, sign а = 0 при а = 0, 1 при а > 0....

8
500 / 346 / 200
Регистрация: 20.10.2016
Сообщений: 1,101
18.03.2018, 08:42 2
1. Я очень сомневаюсь,что секрет содержит слэши.
2. "base64 decoded secret API key" - Вы этого не сделали!
3. Строки 10, 11 зачем 2 раза кодировать в SHA256?
Вам надо собрать строку из урлу + nonce + POST параметры и уже эту готовую строку провести через SHA256 ключ для которого это полученный с биржи секрет, с которым предварительно надо сделать пункт 2.
1
0 / 0 / 0
Регистрация: 03.03.2018
Сообщений: 6
18.03.2018, 14:56  [ТС] 3
TFullControl спасибо за ответ.
Да, то же в шоке был от таких SecKey-ев.
пробую DecodeBase64 для SecKey

Delphi
1
2
...
sign := SHA256DigestToHex(CalcHMAC_SHA256(DecodeBase64(seckey), param));
выдает ошибку типов string и System.TArray<System.Byte>
[dcc32 Error] Unit1.pas(357): E2010 Incompatible types: 'string' and 'System.TArray<System.Byte>'
как его лучше в string преобразовать?

еще момент... они в тз пишут, что нужен и sha512 и sha256 или имеется ввиду sha256, который входит в состав HMAC-SHA512 ?

Добавлено через 2 часа 35 минут
в итоге взял компонент iddecodermime от indi
но до сих пор кракен выдает ошибку сигнатуры.
чего не так делаю( ? c ...Yobit-ом как то проще было...
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
...
 
 nonce := '&nonce=' + IntToStr(noncei);
       param:='https://api.kraken.com/0/private/Balance/'+nonce;
 
api_opt := TStringList.Create;
  api_opt.add(nonce);
 
 
  seckey:='BUz6bsCXXXXXXXXelQ7 / qm0OTjY / 0UTFdy29mq7on7D1Il9tmKV11Ki7CC + ZQ + A2XaVT3CIfnNM3hw ==';
 
 
 sh64:=form1.iddecodermime1.DecodeString(seckey);
 
 sign := SHA256DigestToHex(CalcHMAC_SHA256(sh64, param));
 
 form1.IdHTTP1 := TIdHTTP.Create();
 form1.IdHTTP1.ReadTimeout := 10000;
 form1.IdHTTP1.Request.CustomHeaders.AddValue('API-Key', 'NyKUzr4USNWlHMTRr6A3EjiieQxS11J6NeUcfE2widL4CFKF0vZ7TC0P');
 form1.IdHTTP1.Request.CustomHeaders.AddValue('API-Sign', sign);
 form1.IdHTTP1.Request.UserAgent:='Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36';
 
 form1.IdHTTP1.Request.Host:='';
 
 try
 form1.Memo1.Text:=form1.IdHTTP1.Post('https://api.kraken.com/0/private/Balance',api_opt);
 Except
  on Exception do form1.Memo1.Lines.Text:= form1.idHttp1.Response.RawHeaders.GetText ;
 
end;
 
...
0
500 / 346 / 200
Регистрация: 20.10.2016
Сообщений: 1,101
18.03.2018, 16:03 4
Цитата Сообщение от Alex81_US Посмотреть сообщение
они в тз пишут
Ну вам виднее, что у вас в ТЗ написано. Я бы лучше справку по АПИ кракена вам посоветовал почитать и делать как у них написано.
А по коду вы строу урла неправильно формируете. Всегда было так https://api_url?param1=value
0
0 / 0 / 0
Регистрация: 03.03.2018
Сообщений: 6
18.03.2018, 19:45  [ТС] 5
учитался уже... дальше некуда...
да, спасибо за url, учту.

на php сам кракен рекомендует делать так:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
        }
 
        // build the POST data string
        $postdata = http_build_query($request, '', '&');
 
        // set API key and sign the message
        $path = '/' . $this->version . '/private/' . $method;
        $sign = hash_hmac('sha512', $path . hash('sha256', $request['nonce'] . $postdata, true), base64_decode($this->secret), true);
        $headers = array(
            'API-Key: ' . $this->key,
            'API-Sign: ' . base64_encode($sign)
        );
осталось только это все в делфи как то переработать
0
500 / 346 / 200
Регистрация: 20.10.2016
Сообщений: 1,101
18.03.2018, 19:53 6
Alex81_US, что у вас не так я вам сказал, не вижу чтобы вы в коде это исправили, проект у вас явно коммерческий, соответственно код за вас, на халяву, никто писать не будет.
В приведенном примере на пхп все четко и ясно, осталось только повторить.
0
0 / 0 / 0
Регистрация: 03.03.2018
Сообщений: 6
19.03.2018, 00:43  [ТС] 7
Повторил, не работает...
времени потрачено уйма... результата нет.
готов делиться с человеком талантливее и более толковым чем я. все что нужно... авторизоваться, получить баланс.

на данный момент код процедуры выглядит так

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
procedure krackinfo ();
var
noncei,i:integer;
f : TextFile;
param,s,nonce : ansistring;
sh64,sh256 : ansistring; // array of byte;
sign: ansistring;
SecKey : ansistring;
//seckey: system.WideString;
api_opt : TStringList;
 
begin
 
//  result := '';
 // if api_opt.Count > 0 then
  begin
 
assignfile(f,'nonce.txt');
reset(f);
readln(f,s); noncei:=strtoint(s);
closefile(f);
 
AssignFile(f,'nonce.txt');
ReWrite(f);
s:=inttostr(noncei+1);
WriteLn(f,s);
CloseFile(F);
 
//    param := api_opt[0];
//
//    if api_opt.Count > 1 then
//      for i := 1 to api_opt.Count - 1 do
//        param := param + '&' + api_opt[i];
 
 
// nonce := 'nonce=' + IntToStr(noncei);
//     api_opt.add(nonce);
 
//param:=param + '&' + nonce;
 
//    api_opt.add(nonce);
       //'https://api.kraken.com/0/private/Balance?'
 
 
 nonce := 'nonce=' + IntToStr(noncei);
       //param:='https://api.kraken.com/0/private/Balance/'+nonce;
 
 
         param:=nonce;
api_opt := TStringList.Create;
  api_opt.add(nonce);
 
 
  seckey:='D1nbSwAwSjHRiO1DUQH9Zcj9TLp5kRtSraz2lPRCzmtginJ/O/sGRAt4UX7VtWV34V6aW1gexW39Raemlkr7CA==';
 
 sh64:=form1.iddecodermime1.DecodeString(seckey);
 
 sh256:=SHA256DigestToHex(CalcHMAC_SHA256(sh64, param));
 
 sign := SHA512DigestToHex(CalcHMAC_SHA512(sh64, 'https://api.kraken.com/0/private/Balance?'+sh256));
 
s:=form1.iddecodermime1.DecodeString(sign);
 
 
 form1.IdHTTP1 := TIdHTTP.Create();
 form1.IdHTTP1.ReadTimeout := 10000;
 form1.IdHTTP1.Request.CustomHeaders.AddValue('API-Key', 'XJ3+5Ul3ELT5w6BxECC1vYrz/DgbYCLF7O25D87Q9HWcjhD7vccGs49D');
 form1.IdHTTP1.Request.CustomHeaders.AddValue('API-Sign', s);
 form1.IdHTTP1.Request.UserAgent:='Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36';
 
 form1.IdHTTP1.Request.Host:='';
 
 try
 form1.Memo1.Text:=form1.IdHTTP1.Post('https://api.kraken.com/0/private/Balance?',api_opt);
 Except
  on Exception do form1.Memo1.Lines.Text:= form1.idHttp1.Response.RawHeaders.GetText ;
 
end;
form1.Memo1.Lines.Add (param) ;
form1.Memo1.Lines.Add (sign) ;
form1.Memo1.Lines.Add('db64='+sh64);
form1.Memo1.Lines.Add('db256='+sh256);
form1.Memo1.Lines.Add('sign='+sign);
 
  form1.IdHTTP1.Free;
  api_opt.Free;
end;
end;
key и SecKey реальные
0
0 / 0 / 0
Регистрация: 03.03.2018
Сообщений: 6
20.03.2018, 18:54  [ТС] 8
Вот так, по ощущениям, вроде как бы должна работать...

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
...
api_opt := TStringList.Create;
  api_opt.add(nonce);
  param:=nonce;
 
  seckey:='D1nbSwAwSjHRiO1DUQH9Zcj9TLp5kRtSraz2lPRCzmtginJ/O/sGRAt4UX7VtWV34V6aW1gexW39Raemlkr7CA==';
 
sh64:=form1.iddecodermime1.DecodeString(seckey);
 
sh256:=SHA256DigestToHex(CalcSHA256(param));
 
sign:=SHA512DigestToHex(CalcHMAC_SHA512(Sh64, '/0/private/Balance?'+sh256));
 
 
 form1.IdHTTP1 := TIdHTTP.Create();
 form1.IdHTTP1.ReadTimeout := 10000;
 form1.IdHTTP1.Request.CustomHeaders.AddValue('API-Key', 'XJ3+5Ul3ELT5w6BxECC1vYrz/DgbYCLF7O25D87Q9HWcjhD7vccGs49D');
 form1.IdHTTP1.Request.CustomHeaders.AddValue('API-Sign', form1.idencodermime1.encodeString(sign));
 form1.IdHTTP1.Request.UserAgent:='Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36';
 form1.IdHTTP1.Request.Host:='https://api.kraken.com';
но не работает
0
0 / 0 / 0
Регистрация: 03.03.2018
Сообщений: 6
28.03.2018, 00:19  [ТС] 9
Вопрос решил с помощью костылей... которые озвучивать то не хочется...
за вечер написал нужный скрипт на питоне, переведу его в exe-шник. а прога на делфи будет в нужный момент его запускать...
это конечно ерунда... но за неимением лучшего варианта ... будет так
0
28.03.2018, 00:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.03.2018, 00:19
Помогаю со студенческими работами здесь

Определить значение z=sign x+sign y
Ребят помогите пожалуйста, дали задание , но так уж вышло что в паскале я совсем ничего не...

Определить значение z = sign x + sign у
Определить значение z = sign x + sign у, где -1 при а &lt; 0, sign а= 0 при а = 0, 1 при а &gt; 0....

Вычислить z(x)=sign(x)+sign(y)*sign(x+y)
Вычислить z(x)=sign(x)+sign(y)*sign(x+y) Используя функцию sign(x)=-1 если x&lt;0 0 если x=0 1...

Какой движок подойдет для биржи?
Какой движок подойдет для биржи, типа: Fl, фрилансим и т.п.?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru