Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   HASH ermitteln - Python nach Delphi, aber wie ? (https://www.delphipraxis.net/201660-hash-ermitteln-python-nach-delphi-aber-wie.html)

TERWI 12. Aug 2019 16:36

HASH ermitteln - Python nach Delphi, aber wie ?
 
Ich hab hier aus einem PY-file ein Codeschnipsel, was ich gerne nach Delphi übersetzen möchte:
Delphi-Quellcode:
    salt = '01!8d8F_)r9]4s[qeuXfP%'
    client_token = salt[:2] + 
                   sha1(''.join([str(channel['video_id']),
                                 salt,
                                 channel['access_token'],
                                 server_token,                
                                 channel['client_location'],
                                 'dash:widevine']
                       ).encode('utf-8')).hexdigest()
video_id, access_token, server_token und client_location sind bekannte Strings.

Wenn ich das richtig erkannt habem wird hier ein sah1-Hasch gebildet ?!
Ich hab hier eine DCPCrypt-Komponente und würde gerne mit TDCP_sha1 o.g. entsprechend nachbilden.
Nur was & wie macht denn diese Funktion denn das mit den Strings ?

Kann jemand das nach Delphi "übersetzen", wie ich den String bilden muss ?

Klaus01 12. Aug 2019 20:10

AW: HASH ermitteln - Python nach Delphi, aber wie ?
 
Hallo,

channel scheint ein Dictionary zu sein.
Mit den keys video_id, access_token und client location.

''.join() werden die Parameter Strings zusammengefügt.
Separator ist ier '' - also kein Separator.

In Delphi würde das mit String1+String2.. funktionieren.

Grüße
Klaus

TERWI 13. Aug 2019 08:49

AW: HASH ermitteln - Python nach Delphi, aber wie ?
 
So weit dann klar: Es wird ein HASH aus den einzelnen Strings gebastelt. Ohne Trenner.
Was aber ist dann der Ausdruck "salt[:2]" und was kommt da bei + HASH raus ? ?

Klaus01 13. Aug 2019 09:04

AW: HASH ermitteln - Python nach Delphi, aber wie ?
 
salt[:2] liefert die ersten zwei Zeichen des Salt - hier also '01'
Diese Zeichenkette wird dem Hash vorangestellt.

Grüße
Klaus

Moombas 13. Aug 2019 09:05

AW: HASH ermitteln - Python nach Delphi, aber wie ?
 
@TERWI: Siehe dazu https://docs.python.org/2/tutorial/introduction.html
Code:
>>> word[:2]  # character from the beginning to position 2 (excluded)
In deinem Fall also:
Code:
salt = '01!8d8F_)r9]4s[qeuXfP%'
    client_token = salt[:2] +  sha1(''.join([str(channel['video_id']),
                                 salt,
                                 channel['access_token'],
                                 server_token,
                                 channel['client_location'],
                                 'dash:widevine']
                       ).encode('utf-8')).hexdigest()
salt[:2] = 01
und daran wird mit dem '+' das Ergebnis aus dem SHA1() dran gehängt

Klaus01 13. Aug 2019 09:09

AW: HASH ermitteln - Python nach Delphi, aber wie ?
 
>>> word[:2] # character from the beginning to position 2 (excluded)
dann sollte salt[:2] = 01 sein und nicht 01!

Grüße
Klaus

Moombas 13. Aug 2019 09:11

AW: HASH ermitteln - Python nach Delphi, aber wie ?
 
Hast recht bin bei den Beispielen durcheinander gekommen.

Schokohase 13. Aug 2019 10:17

AW: HASH ermitteln - Python nach Delphi, aber wie ?
 
Mal ein Versuch:
Delphi-Quellcode:
uses
  System.Classes,
  System.Hash,
  System.SysUtils;

type
  TChannel = record
    VideoId: Integer;
    AccessToken: string;
    ClientLocation: string;
  end;

function HexDigest(const ABuffer: TBytes): string;
const
  B2H: array [0 .. 15] of Char = ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f');
var
  I, len: Integer;
  str: string;
begin
  str := '';
  len := Length(ABuffer);
  SetLength(str, len * 2);
  for I := 0 to len - 1 do
  begin
    str[I * 2 + Low(str)] := B2H[(ABuffer[I] shr 4) and $0F];
    str[I * 2 + 1 + Low(str)] := B2H[ABuffer[I] and $0F];
  end;
  Result := str;
end;

function BuildHashStr(const SaltStr: string; const AChannel: TChannel; const AServerToken : string): string;
const
  someString = 'dash:widevine';
var
  strToHash: string;
  bufferToHash, binaryHash: TBytes;
  hasher: THashSHA1;
begin
  strToHash := string.Join('', [ //
    AChannel.VideoId.ToString(), //
    SaltStr, //
    AChannel.AccessToken, //
    AServerToken, //
    AChannel.ClientLocation, //
    someString]);
  bufferToHash := TEncoding.UTF8.GetBytes(strToHash);

  hasher := THashSHA1.Create();
  try
    hasher.Update(bufferToHash);
    binaryHash := hasher.HashAsBytes();
  finally
    hasher.Reset;
  end;
  Result := SaltStr.Substring(0, 2) + HexDigest(binaryHash);
end;

procedure Test;
const
  salt = '01!8d8F_)r9]4s[qeuXfP%';
  server_token = 'server_token';
var
  channel: TChannel;
  hashStr: string;
begin
  channel.VideoId := 1;
  channel.AccessToken := 'access_token';
  channel.ClientLocation := 'client_location';

  hashStr := BuildHashStr(salt, channel, server_token);
  Writeln(hashStr);
end;
ergibt
Code:
01ea8c57f1334dfeabb62030212f997f5c4f0f93c1
und
Code:
import hashlib

salt = '01!8d8F_)r9]4s[qeuXfP%'
server_token = 'server_token'
channel = {'video_id':1,'access_token':'access_token','client_location':'client_location'}

client_token = salt[:2] + hashlib.sha1(''.join([str(channel['video_id']), salt, channel['access_token'], server_token, channel['client_location'], 'dash:widevine'] ).encode('utf-8')).hexdigest()

print(client_token)
ergibt das gleiche Ergebnis ... also müsste das passen

TERWI 13. Aug 2019 15:58

AW: HASH ermitteln - Python nach Delphi, aber wie ?
 
Super !
Es fehlte hier etwas am Verständnis für Python und HASH im allgemeinen (1. Mal probiert...)
Leider funzt die Demo von Schokohase hier nicht. Hab (noch) D2009.
Nach herumsuchen im WWW hab ich's dann mal mit Indy10 (hier drauf) probiert.
Das sieht dann sehr einfach so aus:
Delphi-Quellcode:
uses ... IdHash, IdHashSHA;
...
var
  sha1: TIdHashSHA1;
  Sum, Hash : string
...
  sha1 := TIdHashSHA1.Create;
  try
    Hash := LowerCase(sha1.HashStringAsHex(salt[1] + salt[2] + Sum));
  finally
    sha1.Free;
  end;
Das liefert ebenso das o.g. Ergebnis.
Leider scheitert meine HTTP.Get Anfrage wegen falschem Token ...
Trotzdem Mega Dank !

Klaus01 13. Aug 2019 17:59

AW: HASH ermitteln - Python nach Delphi, aber wie ?
 
.. sollte salt[1] + salt[2] nicht vor dem Hash eingefügt werden?

Delphi-Quellcode:
hassh ;= salt[1] + salt[2] + LowerCase(sha1.HashStringAsHex(Sum));

Ist salt ein AnsiString oder ein UniCode String?
UniCode == 2 Byte
AnsString == 1 Byte

Das bei Deinem Code das gleiche wie beim Pythoncode herauskommt wage ich kaum zu glauben.

Grüße
Klaus

TERWI 13. Aug 2019 19:41

AW: HASH ermitteln - Python nach Delphi, aber wie ?
 
Zitat:

Das bei Deinem Code das gleiche wie beim Pythoncode herauskommt wage ich kaum zu glauben.
Doch, tut es.
Weil...
Ich hab den Fehler hier gefunden. Ein alberner Tippfehler.
Die Abfrage funzt 1A und liefert das gewünschte Ergebnis.

Wenn ich das so richtig sehe, ist alles Unicode - d.h. ich habe nichts expliziert mit Ansistring verwendet.

DieDolly 13. Aug 2019 19:48

AW: HASH ermitteln - Python nach Delphi, aber wie ?
 
Zitat:

Nach herumsuchen im WWW hab ich's dann mal mit Indy10 (hier drauf) probiert.
Warum suchen, wenn das Ergebnis direkt vor einem liegt?

Bis vor Kurzem gabs auf http://www.wolfgang-ehrhardt.de/ noch super Code fürs Hashing.
Vielleicht hat den Code ja noch irgendeiner auf seiner HDD und teilt ihn ...

Schokohase 14. Aug 2019 07:14

AW: HASH ermitteln - Python nach Delphi, aber wie ?
 
Zitat:

Zitat von Klaus01 (Beitrag 1441195)
Ist salt ein AnsiString oder ein UniCode String?
UniCode == 2 Byte
AnsString == 1 Byte

Das ist nicht das Entscheidende!

Wenn der Salt-Wert in einem AnsiString dargestellt werden kann ... nur zu.

Beim Hashen (wir hashen ausschließlich Byte-Werte) muss man für die Vergleichbarkeit mit dem Python-Code die Zeichenfolgen in UTF-8 kodieren (ergibt Byte-Werte).

Das ist das Entscheidende!

Andreas13 14. Aug 2019 12:29

AW: HASH ermitteln - Python nach Delphi, aber wie ?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von DieDolly (Beitrag 1441210)
Zitat:

Nach herumsuchen im WWW hab ich's dann mal mit Indy10 (hier drauf) probiert.
Warum suchen, wenn das Ergebnis direkt vor einem liegt?

Bis vor Kurzem gabs auf http://www.wolfgang-ehrhardt.de/ noch super Code fürs Hashing.
Vielleicht hat den Code ja noch irgendeiner auf seiner HDD und teilt ihn ...

Hallo Community,
ich habe die Daten von unserem kürzlich verstorbenen Gammatester (= Wolfgang Ehrhardt) gespeichert. Seine Hompage mit exzellentem Material wurde vor einigen Tagen endgültig abgeschaltet. Im Anhang findet Ihr den Inhalt von seinem CRC/Hash.
Gruß, Andreas

Schokohase 14. Aug 2019 12:55

AW: HASH ermitteln - Python nach Delphi, aber wie ?
 
Zitat:

Zitat von Andreas13 (Beitrag 1441326)
Hallo Community,
ich habe die Daten von unserem kürzlich verstorbenen Gammatester (= Wolfgang Ehrhardt) gespeichert. Seine Hompage mit exzellentem Material wurde vor einigen Tagen endgültig abgeschaltet. Im Anhang findet Ihr den Inhalt von seinem CRC/Hash.
Gruß, Andreas

Es wäre ja eine Möglichkeit, wenn du diese bei github hochladen würdest. Evtl. findet sich der ein oder andere der diese weiterentwickeln/an neue Versionen anpassen würde.

Inwieweit das rechtlich zulässig wäre kann ich dir allerdings nicht sagen, da ich die Lizenz nicht kenne.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz