![]() |
HMAC SHA256 und Base64 codierter Schlüssel
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:
Danach muss mit dem decodierten Key und einem String ein HMAC SHA256 generiert werden. Dafür habe ich folgende Funktion:
TIdDecoderMIME.DecodeBytes
Code:
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.
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; Hat jemand eine Idee um das Problem zu lösen? Ein alter Beispielkey: 8lzwWMeVNjb0P+oRVlVJZMFWGBgD/9Oq1Yuq8CPga6mX0LGYQ0DWlDNGuF64aYB1bh6jP+Z4/kWQFi/inmf5Qw== |
AW: HMAC SHA256 und Base64 codierter Schlüssel
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:32 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