我正在尝试为 Amazon S3 Web 服务构建一个有效的加密签名,使用 Objective C 编写一个连接库。
我在 ObjC 代码中遇到了 HMAC SHA-1 摘要问题,所以我把它放在一边,并查看现有的工作 Perl 代码,以尝试解决摘要创建问题。
我正在测试包s3ls
命令的HMAC SHA-1 摘要输出,并将其与我取出并放入其自己的 perl 脚本的子例程进行比较:Net::Amazon::S3
_encode
#!/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);
这是此脚本的示例输出:
$ ./testhmac.pl
secret key hex: 6162636431323334
cleartext hex: 4745540a0a0a4672692c2031322044656320323030382031303a30383a353120474d542b30303a30300a2f
digest hex: 63308f9b8a198440d6d8685a3f3f70d0aab02f68
encoded: YzCPm4oZhEDW2GhaPz9w0KqwL2g=
What I am testing is that, if I input the same secret key and cleartext into the same _encode
function of the Net::Amazon::S3
package, I should see the very same secret key, cleartext, and digest bytes.
Indeed, I get the same bytes for the secret key and cleartext.
But I get something different for the digest (and of course the base64 encoding), e.g.:
$ s3ls --access-key=foobar --secret-key=abcd1234
...
secret key hex: 6162636431323334
cleartext hex: 4745540a0a0a4672692c2031322044656320323030382031303a30383a353120474d542b30303a30300a2f
digest hex: c0da50050c451847de7ed055c5286de584527a22
encoded: wNpQBQxFGEfeftBVxSht5YRSeiI=
I have verified that the secret key and clear text are the same input to both scripts. The encoding subroutine is virtually identical in both scripts (except for an unused argument passed to the subroutine, which I remove from my custom version).
What would cause the HMAC SHA-1 digest to be computed differently in both cases, if the input bytes and _encode
subroutine are the same?
(I have also verified the two scripts against the test cases at RFC 2201.)