![]() |
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:
video_id, access_token, server_token und client_location sind bekannte Strings.
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() 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 ? |
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 |
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 ? ? |
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 |
AW: HASH ermitteln - Python nach Delphi, aber wie ?
@TERWI: Siehe dazu
![]()
Code:
In deinem Fall also:
>>> word[:2] # character from the beginning to position 2 (excluded)
Code:
salt[:2] = 01
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() und daran wird mit dem '+' das Ergebnis aus dem SHA1() dran gehängt |
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 |
AW: HASH ermitteln - Python nach Delphi, aber wie ?
Hast recht bin bei den Beispielen durcheinander gekommen.
|
AW: HASH ermitteln - Python nach Delphi, aber wie ?
Mal ein Versuch:
Delphi-Quellcode:
ergibt
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;
Code:
und
01ea8c57f1334dfeabb62030212f997f5c4f0f93c1
Code:
ergibt das gleiche Ergebnis ... also müsste das passen
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) |
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:
Das liefert ebenso das o.g. Ergebnis.
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; Leider scheitert meine HTTP.Get Anfrage wegen falschem Token ... Trotzdem Mega Dank ! |
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz