Warum würde HMAC SHA-1 einen anderen Digest mit derselben Eingabe zurückgeben?

Ich versuche, eine funktionierende verschlüsselte Signatur für den Amazon S3-Webdienst zu erstellen und eine Verbindungsbibliothek mit Objective C zu schreiben.

Ich habe HMAC SHA-1-Digest-Probleme mit dem ObjC-Code festgestellt, daher lege ich das beiseite und schaue mir den vorhandenen, funktionierenden Perl-Code an, um zu versuchen, die Digest-Erstellung zu beheben.

Ich teste die Ausgabe des HMAC SHA-1-Digests voms3ls Befehl desNet::Amazon::S3 Paket und vergleichen Sie das mit dem_encode -Unterprogramm, das ich herausgezogen und in ein eigenes Perl-Skript eingefügt habe:

#!/usr/bin/perl -w                                                                                                                                                                                    

use MIME::Base64 qw(encode_base64);
use Digest::HMAC_SHA1;
use String::Escape qw( printable unprintable );

sub _ascii_to_hex {
    (my $str = shift) =~ s/(.|\n)/sprintf("%02lx", ord $1)/eg;
    return $str;
}

sub _encode {
    my ( $aws_secret_access_key, $str ) = @_;
    print "secret key hex: "._ascii_to_hex($aws_secret_access_key)."\n";
    my $hmac = Digest::HMAC_SHA1->new($aws_secret_access_key);
    $hmac->add($str);
    my $digest = $hmac->digest;
    print "cleartext hex: "._ascii_to_hex($str)."\n";
    print "digest hex: "._ascii_to_hex($digest)."\n";
    my $b64 = encode_base64( $digest, '' );
    print "encoded: ".$b64."\n";
}

my $secret = "abcd1234";
my $cleartext = "GET\n\n\nFri, 12 Dec 2008 10:08:51 GMT+00:00\n/";
_encode($secret, $cleartext);

Hier ist eine Beispielausgabe von diesem Skript:

$ ./testhmac.pl 
secret key hex: 6162636431323334
cleartext hex: 4745540a0a0a4672692c2031322044656320323030382031303a30383a353120474d542b30303a30300a2f
digest hex: 63308f9b8a198440d6d8685a3f3f70d0aab02f68
encoded: YzCPm4oZhEDW2GhaPz9w0KqwL2g=

Was ich teste ist, dass, wenn ich den gleichen geheimen Schlüssel und Klartext in das gleiche @ einge_encode Funktion desNet::Amazon::S3 Paket, sollte ich den gleichen geheimen Schlüssel, Klartext und Digest-Bytes sehen.

Indeed, ich bekomme die gleichen Bytes für den geheimen Schlüssel und den Klartext.

Aber ich bekomme etwas anderes für den Digest (und natürlich die Base64-Codierung),

$ s3ls --access-key=foobar --secret-key=abcd1234
...
secret key hex: 6162636431323334
cleartext hex: 4745540a0a0a4672692c2031322044656320323030382031303a30383a353120474d542b30303a30300a2f
digest hex: c0da50050c451847de7ed055c5286de584527a22
encoded: wNpQBQxFGEfeftBVxSht5YRSeiI=

Ich habe überprüft, dass der geheime Schlüssel und der Klartext für beide Skripte dieselbe Eingabe sind. Die Codierungssubroutine ist in beiden Skripten praktisch identisch (mit Ausnahme eines nicht verwendeten Arguments, das an die Subroutine übergeben wird und das ich aus meiner benutzerdefinierten Version entferne).

Was würde dazu führen, dass der HMAC, SHA-1-Digest in beiden Fällen unterschiedlich berechnet wird, wenn die Eingabebytes und_encode Unterprogramm sind gleich?

(Ich habe auch die beiden Skripte gegen die Testfälle unter @ verifizierRFC 2201.)

Antworten auf die Frage(8)

Ihre Antwort auf die Frage