AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke HASH ermitteln - Python nach Delphi, aber wie ?
Thema durchsuchen
Ansicht
Themen-Optionen

HASH ermitteln - Python nach Delphi, aber wie ?

Ein Thema von TERWI · begonnen am 12. Aug 2019 · letzter Beitrag vom 14. Aug 2019
Antwort Antwort
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
525 Beiträge
 
FreePascal / Lazarus
 
#1

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

  Alt 13. Aug 2019, 09:05
@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
Der Weg ist das Ziel aber man sollte auf dem Weg niemals das Ziel aus den Augen verlieren.

Geändert von Moombas (13. Aug 2019 um 09:12 Uhr)
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.780 Beiträge
 
Delphi 10.4 Sydney
 
#2

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

  Alt 13. Aug 2019, 09:09
>>> word[:2] # character from the beginning to position 2 (excluded)
dann sollte salt[:2] = 01 sein und nicht 01!

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
525 Beiträge
 
FreePascal / Lazarus
 
#3

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

  Alt 13. Aug 2019, 09:11
Hast recht bin bei den Beispielen durcheinander gekommen.
Der Weg ist das Ziel aber man sollte auf dem Weg niemals das Ziel aus den Augen verlieren.
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#4

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

  Alt 13. Aug 2019, 10:17
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

Geändert von Schokohase (13. Aug 2019 um 11:38 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
381 Beiträge
 
Delphi 11 Alexandria
 
#5

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

  Alt 13. Aug 2019, 15:58
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 !
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.780 Beiträge
 
Delphi 10.4 Sydney
 
#6

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

  Alt 13. Aug 2019, 17:59
.. sollte salt[1] + salt[2] nicht vor dem Hash eingefügt werden?

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
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
381 Beiträge
 
Delphi 11 Alexandria
 
#7

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

  Alt 13. Aug 2019, 19:41
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.
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#8

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

  Alt 13. Aug 2019, 19:48
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 ...
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#9

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

  Alt 14. Aug 2019, 07:14
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!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:06 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