perl - 为什么 HMAC SHA-1 会返回具有相同输入的不同摘要?

标签 perl encryption hmac digest sha1

我正在尝试为 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=

我正在测试的是,如果我将相同的 key 和明文输入到相同的 _encode Net::Amazon::S3 的功能包,我应该看到完全相同的 key 、明文和摘要字节。

事实上,我得到了相同的 key 和明文字节。

但是对于摘要(当然还有base64编码),我得到了一些不同的东西,例如:
$ s3ls --access-key=foobar --secret-key=abcd1234
...
secret key hex: 6162636431323334
cleartext hex: 4745540a0a0a4672692c2031322044656320323030382031303a30383a353120474d542b30303a30300a2f
digest hex: c0da50050c451847de7ed055c5286de584527a22
encoded: wNpQBQxFGEfeftBVxSht5YRSeiI=

我已经验证 key 和明文是两个脚本的相同输入。两个脚本中的编码子例程实际上是相同的(除了传递给子例程的未使用参数,我从自定义版本中删除了该参数)。

如果输入字节和 _encode 会导致两种情况下 HMAC SHA-1 摘要的计算方式不同?子程序都一样吗?

(我还针对 RFC 2201 的测试用例验证了这两个脚本。)

最佳答案

我发现在比较中我遇到的主要问题是:

  • 确保两次比较中的数据和 key 相同
  • 确保数据和键在两次比较中使用相同的字符编码
  • 确保在两个脚本中传递的 key 和文本相同,即哪个是 key ,哪个是文本(这不止一次让我着迷)。

  • 尝试使用 Digest::SHA 模块为您创建哈希并将结果与​​之进行比较。
    use Digest::SHA qw(hmac_sha1_hex);
    my $hash = hmac_sha1_hex($data, $key);
    

    请参阅 http://perldoc.perl.org/Digest/SHA.pdf 上的文档

    关于perl - 为什么 HMAC SHA-1 会返回具有相同输入的不同摘要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/362461/

    相关文章:

    python - Perl 到 python 的移位翻译

    perl - 如何阻止 CPAN 访问无响应的软件包存储库?

    linux - Red Hat linux - "turn off"加密检查

    amazon-s3 - 我可以创建一个 s3 存储桶策略来阻止所有非加密上传,但允许 Athena DB 引擎写入非加密文件吗?

    encryption - 解码英国的 NHS 测试和追踪二维码

    php - PHP 和 Go 中的 hmac 哈希不匹配

    Perl 子程序超时

    Perl - 将对象的哈希值作为类中的单个对象返回

    java - 使用特定 key 生成 10 位 TOTP 密码

    Java 和 Python 生成不同的 Hmac-SHA256 输出