Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi DEC und HMAC-SHA-256 (https://www.delphipraxis.net/150505-dec-und-hmac-sha-256-a.html)

nru 4. Mai 2010 09:25

Re: DEC und HMAC-SHA-256
 
Hi Codewalker,

ich hab die letzten Tage auch an diesem Thema gearbeitet ... bisweilen sehr erfolglos.
Aber jetzt endlich der Durchbruch - und das Danke Deiner Quellen hier! :thumb:

Mit ein paar kleinen Änderungen hat Deine (bzw. Eure) klasse Vorarbeit nun endlich funktioniert und die Authentifizierung läuft glatt durch. Die Sache mit dem php-Vergleich hat mir auch gut gefallen und war recht hilfreich.

Hier mal mein Input:

Delphi-Quellcode:
function GenerateHMACSignature(Text, key: ansistring): ansistring;
var
   ctx: THMAC_Context;
   phash: PHashDesc;
   mac: THashDigest;
begin
   phash := FindHash_by_Name('SHA256');
   if phash = nil then begin
      {Action for 'Hash function not found/registered.'}
      exit;
   end;
   hmac_init(ctx, phash, @key[1], length(key));
   hmac_update(ctx, @Text[1], length(Text));
   hmac_final(ctx, mac);
   // Result := HexStr(@mac, sizeof(mac));
        Result := Base64Str(@mac, sizeof(TSHA256Digest));
end;
(Base64Str nicht HexStr)

Diese Einbindung als zusätzlichen TSoapHeader
Delphi-Quellcode:
    // sAWSID = Secret Key
    AmazonTimestamp := FormatDateTime('yyyy"-"mm"-"dd"T"hh":"nn":00Z"', emt_now);
    AmazonString   := 'ItemSearch' + AmazonTimestamp;
    AmazonSignature := GenerateHMACSignature( AmazonString, sAWSID );
brachte folgendes funktionierende (!) Ergebnis (AWSAccessKeyID hab ich hier rausgenommen):

Delphi-Quellcode:
<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
               xmlns:xsd="http://www.w3.org/2001/XMLSchema"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SOAP-ENV:Header>
   <AWSAccessKeyId xmlns="http://security.amazonaws.com/doc/2007-01-01/">...</AWSAccessKeyId>
   <Timestamp xmlns="http://security.amazonaws.com/doc/2007-01-01/">2010-05-04T08:00:00Z</Timestamp>
   <Signature xmlns="http://security.amazonaws.com/doc/2007-01-01/">kXCgfQHO3Mh1MXDul5o2HwLMYZHtnEBSY6uhnJt+XW4=</Signature>
</SOAP-ENV:Header>

<SOAP-ENV:Body><ItemSearch xmlns="http://webservices.amazon.com/AWSECommerceService/2009-11-01">...
Und genau diese Signature kXCgf... bekomme ich auch über das (ebenfalls leicht korrigierte) php-Script

Delphi-Quellcode:
<?php
   session_start();
   $t = $_REQUEST["t"];
   $k = $_REQUEST["k"];
   if ((empty($t)) || (empty($k)))
   {
      die;
   }

// Zum besseren Vergleich, Sek. auf 00 gesetzt
$aktuelle        = gmdate("Y-m-d\TH:i:\\0\\0\Z");
// $aktuelle        = gmdate("Y-m-d\TH:i:s\Z");
$aktuellezeit   = urlencode($aktuelle);

// ! Zusammengesetzte HashDaten aus Aktion und Timestamp
$key = $t.$aktuelle;

$signature1 = hash_hmac("sha256", $key, $k, true);
$signature2  = base64_encode($signature1);
     
print "HashData: \t $key
";
print "Timestamp: \t $aktuelle
";
print "Timestamp (URLEnccode): \t $aktuellezeit
";
print "Text: \t $t
";
print "Key: \t $k
";
print "Result: \t $signature1 
";
print "Result_Base64: \t $signature2";
?>
Output (AWS_Key hab ich entfernt):
Delphi-Quellcode:
HashData: ItemSearch2010-05-04T08:00:00Z
Timestamp: 2010-05-04T08:00:00Z
Timestamp (URLEnccode): 2010-05-04T08%3A00%3A00Z
Text: ItemSearch
Key:
Result: p }ÎÜÈu1pî6Ìaí@Rc«¡~]n
Result_Base64: kXCgfQHO3Mh1MXDul5o2HwLMYZHtnEBSY6uhnJt+XW4=


Gruss
nru

Zitat:

Es ist echt ein Krampf, die Schnittstelle war mal so gut
DAS kann ich nur bestätigen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:09 Uhr.
Seite 2 von 2     12   

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