我正在尝试为Amazon S3 Web服务构建一个可用的加密签名,使用Objective C编写连接库.
我已经遇到了使用ObjC代码的HMAC SHA-1摘要问题,因此我将其放在一边,查看现有的,正在运行的Perl代码,以尝试解决摘要创建问题.
我正在测试包的s3ls
命令中的HMAC SHA-1摘要输出Net::Amazon::S3
,并将其与_encode
我提取并放入其自己的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);
以下是此脚本的示例输出:
$ ./testhmac.pl secret key hex: 6162636431323334 cleartext hex: 4745540a0a0a4672692c2031322044656320323030382031303a30383a353120474d542b30303a30300a2f digest hex: 63308f9b8a198440d6d8685a3f3f70d0aab02f68 encoded: YzCPm4oZhEDW2GhaPz9w0KqwL2g=
我测试的是,如果我将相同的密钥和明文输入到包的相同_encode
功能中Net::Amazon::S3
,我应该看到完全相同的密钥,明文和摘要字节.
实际上,我获得了密钥和明文的相同字节.
但是我得到了一些不同的摘要(当然还有base64编码),例如:
$ s3ls --access-key=foobar --secret-key=abcd1234 ... secret key hex: 6162636431323334 cleartext hex: 4745540a0a0a4672692c2031322044656320323030382031303a30383a353120474d542b30303a30300a2f digest hex: c0da50050c451847de7ed055c5286de584527a22 encoded: wNpQBQxFGEfeftBVxSht5YRSeiI=
我已经验证了密钥和明文是两个脚本的相同输入.编码子例程在两个脚本中几乎完全相同(传递给子例程的未使用的参数除外,我从自定义版本中删除了该参数).
如果输入字节和_encode
子例程相同,那么在两种情况下会导致HMAC SHA-1摘要的计算方式不同?
(我还在RFC 2201中验证了针对测试用例的两个脚本.)