Por que o HMAC SHA-1 retornaria um resumo diferente com a mesma entrada?

Estou tentando criar uma assinatura criptografada funcional para o serviço da web Amazon S3, escrevendo uma biblioteca de conexões usando o Objetivo C.

Eu encontrei problemas de digestão HMAC SHA-1 com o código ObjC, então estou colocando isso de lado e olhando para o código Perl em funcionamento existente, para tentar solucionar a criação de digestão.

Estou testando a saída de resumo HMAC SHA-1 dos3ls comando doNet::Amazon::S3 pacote e comparando-o com o_encode sub-rotina que eu retirei e coloquei em seu próprio script perl:

#!/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);

Aqui está um exemplo de saída deste script:

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

O que estou testando é que, se eu inserir a mesma chave secreta e texto não criptografado na mesma_encode função doNet::Amazon::S3 pacote, eu devo ver a mesma chave secreta, texto não criptografado e digerir bytes.

Na verdade, eu recebo os mesmos bytes para a chave secreta e o texto não criptografado.

Mas recebo algo diferente para o resumo (e, claro, a codificação base64), por exemplo:

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

Eu verifiquei que a chave secreta e o texto não criptografado são a mesma entrada para os dois scripts. A sub-rotina de codificação é praticamente idêntica nos dois scripts (exceto por um argumento não utilizado passado para a sub-rotina, que removo da minha versão personalizada).

O que faria com que o resumo HMAC, SHA-1 fosse computado de maneira diferente nos dois casos, se os bytes de entrada e_encode sub-rotina são os mesmos?

(Também verifiquei os dois scripts nos casos de teste emRFC 2201.)

questionAnswers(4)

yourAnswerToTheQuestion