Ale*_*lds 5 encryption perl sha1 digest hmac
我正在尝试为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);
Run Code Online (Sandbox Code Playgroud)
以下是此脚本的示例输出:
$ ./testhmac.pl
secret key hex: 6162636431323334
cleartext hex: 4745540a0a0a4672692c2031322044656320323030382031303a30383a353120474d542b30303a30300a2f
digest hex: 63308f9b8a198440d6d8685a3f3f70d0aab02f68
encoded: YzCPm4oZhEDW2GhaPz9w0KqwL2g=
Run Code Online (Sandbox Code Playgroud)
我测试的是,如果我将相同的密钥和明文输入到包的相同_encode功能中Net::Amazon::S3,我应该看到完全相同的密钥,明文和摘要字节.
实际上,我获得了密钥和明文的相同字节.
但是我得到了一些不同的摘要(当然还有base64编码),例如:
$ s3ls --access-key=foobar --secret-key=abcd1234
...
secret key hex: 6162636431323334
cleartext hex: 4745540a0a0a4672692c2031322044656320323030382031303a30383a353120474d542b30303a30300a2f
digest hex: c0da50050c451847de7ed055c5286de584527a22
encoded: wNpQBQxFGEfeftBVxSht5YRSeiI=
Run Code Online (Sandbox Code Playgroud)
我已经验证了密钥和明文是两个脚本的相同输入.编码子例程在两个脚本中几乎完全相同(传递给子例程的未使用的参数除外,我从自定义版本中删除了该参数).
如果输入字节和_encode子例程相同,那么在两种情况下会导致HMAC SHA-1摘要的计算方式不同?
(我还在RFC 2201中验证了针对测试用例的两个脚本.)
我发现比较哈希时遇到的主要问题是:
尝试使用 Digest::SHA 模块为您创建哈希并将结果与其进行比较。
use Digest::SHA qw(hmac_sha1_hex);
my $hash = hmac_sha1_hex($data, $key);
Run Code Online (Sandbox Code Playgroud)
请参阅http://perldoc.perl.org/Digest/SHA.pdf上的文档