Авторизация через хэшей SHA512

Доброго для ребята… Авторизация на сайте http://testapi.screeninghub.ge/api/Authorize/SignIn делается через Postman таким образом : генерируется хэшей SHA512 из сайте SHA512 Hash Generator Online передаётся UserName , pasword , SecretKey и текущая дата, на пример: Mylogin@gmail.comNfdgdfg654jdfJUghjgh22.04.2021 вот так без пробелов. у Postman-ов вкладке Headers передаётся это генерирование хэшей и в кладке Body тип raw и JSON формате ещё логин и пароль . вот так

{
  "userName": "Mylogin",
  "password": "********"
}

и получаю “success”: true я пытаюсь передать параметры

procedure TForm1.Button1Click(Sender: TObject);
  var
    MyParams :  TStringList;
    DT : TDateTime;
     //---------------------------
     IdHashSHA1: TIdHashSHA1;
begin
  DT:= Now;
  try
    // ---TStringList Создать
    MyParams:= TStringList.Create;
    //-------------------------------
    IdHashSHA1:=TIdHashSHA1.Create;
    //---- Всё параметри внимательно
    MyParams.Add('userName=mylogin') ;
    MyParams.Add('pasword=******');
    MyParams.Add('SecretKey=jv76sfdhghjhgk,hjkjhd') ;
    MyParams.Add(DateToStr(DT));
    //-------------Вот здесь не понял как мне генерировать это Генератор хэшей SHA512--------------------
    IdHashSHA1.HashStreamAsHex(MyParams);

  //--------HandleRedirects := true; ----------------------
   IdHTTP1.HandleRedirects := true;
   // -------
   IdHTTP1.IOHandler := IdSSLIOHandlerSocketOpenSSL1;
  //--
     IdHTTP1.Request.ContentType := 'application/json, application/x-www-form-urlencoded';   // application/x-www-form-urlencoded  // application/json
     IdHTTP1.Request.Charset := 'utf-8';
    // Хранить тексть запроса на
    Memo1.Text := (IdHTTP1.Post('http://testapi.screeninghub.ge/api/Authorize/SignIn', MyParams));

  finally
     MyParams.Free;
  end;

Не проходить , потом думаю что надо генерировать SHA512 и то не получилось .

 procedure TForm1.Button1Click(Sender: TObject);
var
  pSHA : TIdHashSHA1;
begin
  pSHA := TIdHashSHA1.Create;
  try
    Memo1.Text :=  pSHA.HashStringAsHex('Mylogin@gmail.comNfdgdfg654jdfJUghjgh22.04.2021');
  finally
    pSHA.Free;
  end;
end;

Вопрос: Как и что я должен передать на Delphi XE3 ?


Так видимо надо TIdHashSHA512 )
Только его вроде бы надо подключить https://stackoverflow.com/a/47383798/964478

1 лайк

на XE3 не как не получается хеширования SHA512 -потому что говорят здесь https://laptrinhx.com/sha-hash-with-c-builder-and-delphi-4173384071/

Основа поддержки хеширования впервые появилась в RTL около выпуска 2009 года, но в XE8 (2015) мы получили модуль System.Hash , который принес хеши MD5, SHA-1 и Боба Дженкинса. Затем в 10.0 Seattle (2015) он был расширен за счет поддержки SHA-2 . Совсем недавно в версии 10.2 Tokyo (2017) хэш-функции были расширены, чтобы принимать либо строку, либо поток в дополнение к исходным байтам

procedure TForm1.Button1Click(Sender: TObject);
var
  UserName,  SecretKey, Password: string;
  mydate : string;
  Fullparam : string;
  Hash : string;
begin
   UserName := 'MyLogin';
   SecretKey := 'jghhjgghjhkhjkhhhhjkjhk';
   Password := 'MyPass';
   mydate := FormatDateTime('dd.mm.yyyy',now());
   Fullparam := UserName+SecretKey+Password+mydate;
   Hash := THashSHA2.GetHashString(Fullparam, THashSHA2.TSHA2Version.SHA512).ToUpper;
   // для проверки получаю в  Memo1 и это проверял Postman-е
   Memo1.Text := Hash;
end;

end.

Установил RAD Studio 10.4 и хеширования SHA512 работает нормально… Нечего страшного если я напишу только эту форму на RAD Studio 10.4 и потом буду вызвать .exe файл

Так это про стандартные библиотеки самого Дельфи речь, но выше в коде же использовался Инди, и там вроде можно и раньше, как по моей ссылке советуют подключить OpenSSL для Инди, и тогда вроде бы появится поддержка и SHA512 в Инди. Судя по гуглу TIdHashSHA512 в Инди был как минимум в 2010.

Очень много я старался. не как не получил (нормальны имею виду — правильный SHA512) который потом передать Postman-е и чтобы он работал…

Тогда можно другую библиотеку взять

HashLib4Pascal - Free Pascal wiki

Уже разобрался RAD Studio 10.4 с помощью модуль System.Hash и напишу эту форму на Delphi 10.4 и компилирование exe файл можно вызвать из XE3 так
ShellExecute(Handle,PChar('open'),PChar('полный путь к первому exe'),nil,nil,0);

Так это сложнее, чем библиотеку взять и не разделять проект )
Вдруг нужно будет передать данные в другие части программы оттуда и т.д.

Не, и так много время потерял и главное результат… как я это решаю не кому не интересно … я с вами согласен это когда работаешь в команде - там надо учитывать других мнения тоже … А так это какой то часть одного проекта - который надо быстро набабахат и забыть как страшный сон :joy: уже весна — на рыбалку надо ходить :wink:

Все параметры передаю так

procedure TForm1.Button1Click(Sender: TObject);
  const URL = 'http://testapi.screeninghub.ge/api/Authorize/SignIn';
var
  UserName,  SecretKey, Password: string;
  mydate : string;
  Fullparam : string;
  Hash : string;
  MyParams :  TStringList;
  RequestBody: ISuperObject;

begin
    try
    // ---TStringList Создать
    MyParams:= TStringList.Create;
    //--------------
    NetHTTPClient1.Create(nil);
 //------------------------------------------
     UserName := 'MyLogin';
     SecretKey := 'jghhjgghjhkhjkhhhhjkjhk';
     Password := 'MyPass';
     mydate := FormatDateTime('dd.mm.yyyy',now());
     Fullparam := UserName+SecretKey+Password+mydate;
 //--------------------------------
   //--------HandleRedirects := true; ----------------------
   IdHTTP1.HandleRedirects := true;
   // -----------------------
   IdHTTP1.IOHandler := IdSSLIOHandlerSocketOpenSSL1;
 //--------------------------------
     Hash := THashSHA2.GetHashString(Fullparam, THashSHA2.TSHA2Version.SHA512).ToUpper;
 //-------------------------------------
     MyParams.Add('Hash='+Hash+'');
     MyParams.Add('userName=MyLogin');
     MyParams.Add('password=MyPass');

 //------------------------------------------------------------------------
  idHTTP1.Request.ContentType := 'application/json';
  idHTTP1.Request.ContentEncoding := 'utf-8';
  Idhttp1.Request.Accept := 'application/json';
//  Idhttp1.Request.AcceptEncoding :='raw';
 //-----------------------------------------------------------
    Memo1.Text := IdHTTP1.Post(URL, MyParams);
//  Memo1.Text := Hash;
    finally
         MyParams.Free;
    end;
end;

и получаю HTTP 400 неверный запрос Вопрос: где и какой ошибку я допускаю ?

JSON так вряд ли получится.
Delphi HTTP Post JSON - Stack Overflow

Я тоже это подозреваю , MyParams.Add(‘Hash=’+Hash+’’); = это не JSON MyParams.Add(‘userName=MyLogin’); и MyParams.Add(‘password=MyPass’); они JSON да… Значить надо Hash передать как и есть и userName=MyLogin и password=MyPas передать как JSON потом надо передать

Memo1.Text := IdHTTP1.Post(URL, и Headers и JSON)  

Да ?

Ну надо как на скриншотах в первом посте.
Хеш в headers, остальное в тело в виде JSON. '{"userName": "MyLogin", "password": "MyPass"}'

Так тоже самое ошибка

procedure TForm1.Button1Click(Sender: TObject);
  const URL = 'http://testapi.screeninghub.ge/api/Authorize/SignIn';
var
  UserName,  SecretKey, Password: string;
  mydate : string;
  Fullparam : string;
  Hash : string;
  JSON :  TStringStream;
  Headers : TStringList;

begin
    try
 //------------------------------------------
     UserName := 'MyLogin';
     SecretKey := 'jghhjgghjhkhjkhhhhjkjhk';
     Password := 'MyPass';
     mydate := FormatDateTime('dd.mm.yyyy',now());
     Fullparam := UserName+SecretKey+Password+mydate;
 //--------------------------------
   //--------HandleRedirects := true; ----------------------
   IdHTTP1.HandleRedirects := true;
   // -----------Только это для SSL -------------
   IdHTTP1.IOHandler := IdSSLIOHandlerSocketOpenSSL1;
 //--------------------------------
     Hash := THashSHA2.GetHashString(Fullparam, THashSHA2.TSHA2Version.SHA512).ToUpper;
 //-------------------------------------
    Headers := TStringList.Create;
    Headers.Add('Hash='+Hash+'');
    // ---TStringList Создать
    JSON:= TStringStream.Create('{"userName": "MyLogin",  '+
                                ' "password": "MyPass"  '+
                                '}');

 //------------------------------------------------------------------------

  idHTTP1.Request.ContentType := 'application/json';
  idHTTP1.Request.ContentEncoding := 'utf-8';
  Idhttp1.Request.Accept := 'application/json';
 //---------------Передаю Headers и JSON--------------------------------------------
     idHTTP1.Post(URL, Headers, JSON);
//  ------------------------
    finally
         Headers.Free;
         JSON.Free;
    end;
end;

end.

Чтобы убедиться что всё отправляется так, как надо, можно например использовать Fiddler или https://hookbin.com/ (для фиддлера надо разрешить его SSL сертификат и указать его прокси в клиенте, для второго — нажать Create и отправить запрос на указанный адрес).

1 лайк

Alex P. Огромное спасибо за советь , за то что так много времени уделили.! :handshake: Реализовал так через NetHTTPClient1 и работает нормально

procedure TForm1.Button1Click(Sender: TObject);
  Const MyURL =  'http://testapi.screeninghub.ge/api/Authorize/SignIn';
var
  UserName,  SecretKey, Password: string;
  mydate : string;
  Fullparam : string;
  Hash : string;
  JSON :  TStringStream;
begin
 //----------------------------------------
     UserName := 'MyLogin';
     SecretKey := 'jghhjgghjhkhjkhhhhjkjhk';
     Password := 'MyPass';
     mydate := FormatDateTime('dd.mm.yyyy',now());
     // Обединить таком порядке как на документацие
     Fullparam := UserName+SecretKey+Password+mydate;
 //-------------хешироват SHA512 UserName+SecretKey+Password+mydate ---------------------------
 Hash := THashSHA2.GetHashString(Fullparam, THashSHA2.TSHA2Version.SHA512).ToUpper;
 //-----------передаю Headers = hash -----------------------------
  NetHTTPClient1.CustomHeaders['Hash'] := hash;
 //-----------------------------------------
  NetHTTPClient1.ContentType := 'application/json';
  NetHTTPClient1.AcceptEncoding := 'UTF-8';
//-----------------Body JSON ------------------------
     JSON:= TStringStream.Create('{"userName": "MyLogin",  '+
                                 ' "password": "MyPass"  '+
                                 '}');
  //----------------передаю URL + только JSON .! ----------------------
 Memo1.Lines.Text := NetHTTPClient1.Post(MyURL,  JSON).ContentAsString();
end;
end.