opensslがsha256を生成します。

opensslがsha256を生成します。

<openssl dgst -sha256 -hmac>で計算したのと同じ結果でsha256署名を計算しようとしています。このトピックが議論されました。質問。このコンテンツに触発され、sha256 HMAC計算のさまざまな実装について学ぶために、小さなPerlスクリプトを書いています。

use strict;
use warnings;
use Digest::SHA qw(sha256 hmac_sha256_hex hmac_sha256_base64);
use Digest::HMAC qw(hmac_hex);

my $msg = 'Value-corresponding_to_openssls_EVP_MD structure';
my $key = 'fq6if8aaxLTw0EHRAEkyvCbfa5O9BclbCCB6mtVsWO14KtyIdzIakzzlFGttMaw0';
my ($p1Sig, $p2Sig, $p3Sig, $odSig, $omSig);
my $DgstCmd = "echo \"$msg\" | openssl dgst -sha256 -hmac \"$key\"";

$p1Sig = hmac_sha256_hex($msg, $key);
$p2Sig = hmac_hex($msg, $key, \&sha256);
$p3Sig = hmac_sha256_base64($msg, $key);

$odSig = `$DgstCmd`;
$odSig =~ /= (\w*)/;

print "message\t<$msg>\nkey\t<$key>\nsignatures:\n  openssl  = <$1>\n  perlSHA  = <$p1Sig>\n  perlHMAC = <$p2Sig>\n  perlSHAbase = <$p3Sig>\n";

system ("openssl version");

結果は予想とは異なります(win10で実行)。

message <Value-corresponding_to_openssls_EVP_MD structure>
key     <fq6if8aaxLTw0EHRAEkyvCbfa5O9BclbCCB6mtVsWO14KtyIdzIakzzlFGttMaw0>
signatures:
  openssl  = <a1a262e3d0393b076b53620d7924b04ae8c6d9c66a1a1aadd6c1b6e2fd27b8d8>
  perlSHA  = <2782c620c8c799d2c6b77d306cfca9be7dd2820effe66483d6b97dab7ada31f5>
  perlHMAC = <2782c620c8c799d2c6b77d306cfca9be7dd2820effe66483d6b97dab7ada31f5>
  perlSHAbase = <J4LGIMjHmdLGt30wbPypvn3Sgg7/5mSD1rl9q3raMfU>
OpenSSL 1.1.1g  21 Apr 2020

私はLinuxシステム(SMP PREEMPT Wed Nov 8 11:54:06 CET 2017 x86_64 GNU / Linux)で実行しています。

message <Value-corresponding_to_openssls_EVP_MD structure>
key     <fq6if8aaxLTw0EHRAEkyvCbfa5O9BclbCCB6mtVsWO14KtyIdzIakzzlFGttMaw0>
signatures:
  openssl  = <fadbde9a78101454d987d58ee00f6442f75a9f740202acbf9f1cb6933eeb27bf>
  perlSHA  = <2782c620c8c799d2c6b77d306cfca9be7dd2820effe66483d6b97dab7ada31f5>
  perlSHAbase = <J4LGIMjHmdLGt30wbPypvn3Sgg7/5mSD1rl9q3raMfU>
OpenSSL 1.1.0g  2 Nov 2017

すべてのPerlバージョンは同じ結果を示しています。 opensslは他の結果を示しています。最も興味深いのは、opensslのバージョンによって結果が異なることです。

質問1:opensslのバージョン間で結果が異なるのはなぜですか?質問 2: openssl dgst -sha256 -hmac

楽しく過ごしてください

ベストアンサー1

my $DgstCmd = "echo \"$msg\" | openssl dgst -sha256 -hmac \"$key\"";

echoメッセージに改行文字を追加します。だからこれは"$msg\n"代わりにLinuxでダイジェストされます$msg。このダイジェスト値を得るためにWindowsで正確に何をするかはわかりませんが、確かに出力以上のものです$msg

つまり、Perlやopensslには何の問題もありません。 Perlコードと他の入力をopensslに提供するだけです。

おすすめ記事