AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

HMAC SHA256 und Base64 codierter Schlüssel

Ein Thema von Crataeis · begonnen am 19. Nov 2019 · letzter Beitrag vom 20. Nov 2019
Antwort Antwort
Crataeis

Registriert seit: 19. Nov 2019
1 Beiträge
 
Delphi 10.3 Rio
 
#1

HMAC SHA256 und Base64 codierter Schlüssel

  Alt 19. Nov 2019, 22:53
Hallo zusammen,

ich möchte mit einem Rest-Clienten auf eine API zugreifen.

Ich habe dafür einen alphanumerischen Key bekommen, der in Base64 codiert ist. Dieser muss zwingend in 64 Bytes decodiert werden bevor ich ihn weiter verwenden kann. Dies mache ich mit:

Code:
TIdDecoderMIME.DecodeBytes
Danach muss mit dem decodierten Key und einem String ein HMAC SHA256 generiert werden. Dafür habe ich folgende Funktion:

Code:
function tform1.CalculateHMACSHA256(const value, skey: String): String;
var
hmac: TIdHMACSHA256;
hash: TIdBytes;
begin
LoadOpenSSLLibrary;
if not TIdHashSHA256.IsAvailable then
showmessage('Error');
hmac := TIdHMACSHA256.Create;
try
hmac.Key := IndyTextEncoding_UTF8.GetBytes(skey);
hash := hmac.HashValue(IndyTextEncoding_UTF8.GetBytes(value));
Result := ToHex(hash);
finally
hmac.Free;
end;
end;
Das Problem ist, dass ich hier meinen Key nicht einsetzen kann ohne ihn in einen String umzuwandeln bzw. ihn gleich in einen String zu decodieren. Dadurch ist er aber nicht mehr brauchbar und das Ergebnis nicht korrekt.

Hat jemand eine Idee um das Problem zu lösen?

Ein alter Beispielkey: 8lzwWMeVNjb0P+oRVlVJZMFWGBgD/9Oq1Yuq8CPga6mX0LGYQ0DWlDNGuF64aYB1bh6jP+Z4/kWQFi/inmf5Qw==
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
629 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: HMAC SHA256 und Base64 codierter Schlüssel

  Alt 20. Nov 2019, 12:57
Ich denke du musst deinen Key (skey) zuerst ins binäre Format umwandeln, also nicht einfach den String 1:1 als Bytefolge.

Ich vermute mal dein Key ist ein HEX-String: "23BF70B2A0" (usw.). Hier darfst du nicht einfach die Bytefolge dieses String verwenden sondern muss ihen zuerst binär umwandeln. Mein Beispiel Key "23BF70B2A0" wären also nicht 10 Bytes sondern nur 5 mit den Bytewerten 23, BF, 70, B2 und A0.

Dieses ist ein Beispiel wie ich das mache, aber dieser Code verwendet nicht Indy sondern ein kommerzielles Produkt. Du kannst den Code so also nicht verwenden, aber er soll dir als Hilfe dienen. HexToBin macht die von mir beschriebene Umwandlung des Strings in eine Bytefolge. ByteToHex ist das umgekehrte.
Delphi-Quellcode:
function Create_HMAC_SHA256(const Text, Key: string): string;
var
  mac: TrfMacBase;
  k, b: TrfByteArray;
begin
  k := nil;
  b := nil;
  if (Text = '') or (Key = '') then
  begin
    Result := '';
    Exit;
  end;

  mac := TrfHmacSha256.Create();
  try
    k := HexToBytes(Key); // Umwandlung von String "A1FFB0" in Bytes A1, FF, B0
    b := TrfConverter.GetBytes(Text);

    mac.Initialize(k);
    mac.CreateDigest(b, 0, Length(b));
    Result := LowerCase(BytesToHex(mac.Digest())); // Umwandlung der Bytes A1, FF, B0 in String "A1FFB0"
  finally
    mac.Free();
  end;
end;

Geändert von Rolf Frei (20. Nov 2019 um 14:00 Uhr)
  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 16:54 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