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에 제공하기만 하면 됩니다.

답변2

당신 말이 맞아요. 고마워요, 스티븐.

이 문제는 crpyto api로 인해 발생합니다. 때로는 hmac-sha256을 사용하여 메시지에 서명해야 합니다. 내 진짜 문제는 내 컴퓨터가 실행되는 시스템 시간과 공급자의 컴퓨터 시간입니다.

c 버전 Perl 및 openssl을 사용하여 테스트 세트가 완료된 경우. 작동하는 테스트베드에 관심이 있는 사람은 다음과 같습니다.

이전 채팅에서 찾은 c 함수는 실행 파일로 패키지되어 있습니다.

// using openssl; compile with [-Wall -g -O2] -lcrypto
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <openssl/evp.h>
#include <openssl/hmac.h>

#define VERBOSE 1
void usage (char*);
/*-----------------------------------------------------------------------------
 * mx_hmac_sha256 - wrapper to HMAC and EVP_sha256
 *-------------------------------------------------------------------------- */
unsigned char *mx_hmac_sha256 (const void *key, int keylen,
                              const unsigned char *data, int datalen,
                              unsigned char *result, unsigned int *resultlen) {
    return HMAC (EVP_sha256(), key, keylen, data, datalen, result, resultlen);
}

/*-----------------------------------------------------------------------------
 * main - begin coding
 *-------------------------------------------------------------------------- */
int main (int argc, char **argv) {
register char *p;
char flag = 0, *key = 0, *msg = 0, *buffer;
extern char *optarg;
extern int optind;
unsigned char *result = NULL;
unsigned int i, keylen, msglen, resultlen = (-1);
int c;

    while ((c = getopt(argc, argv, "?hvk:m:")) != -1) {
        switch (c) {
            case 'h':
            case '?':   usage (argv[0]);
                        return (0);
            case 'v':   flag |= VERBOSE;
                        break;
            case 'k':   key = optarg;
                        break;
            case 'm':   msg = optarg;
                        break;
            default:    printf ("unknown option <%c>\n", c);
                        usage (argv[0]);
                        return (-1);
        }
    }
    if ((argc - optind) > 0 ) {
        printf ("err: to many parameters, confused\n");
        usage (argv[0]);
        return (-2);
    }

    if (!key) {
        key = strdup ("security is awesome");
    }
    keylen = strlen(key);
    if (!msg) {
        msg = strdup ("this is highly sensitive user data");
    }
    msglen = strlen(msg);

    result = mx_hmac_sha256 ((const void *)key, keylen, (unsigned char *) msg, msglen, result, &resultlen);
    if (resultlen) {
        c = (2 * resultlen) + 1;
        buffer = malloc ((sizeof(char) *c));
        memset (buffer, 0, c);
        for (i = 0, p = buffer; i < resultlen; i++) {
          sprintf (p, "%02x", result[i]);
          p += 2;
        }
        if (flag & VERBOSE) {
            printf ("message: <%s>\nkey: <%s>\nsignature <%s>\n", key, msg, buffer);
        } else {
            printf ("%s",buffer);
        }
        return (0);
    } else {
        printf ("no signature\n");
    }
}

/*---------------------------------------------------------------------------
 * usage
 *-------------------------------------------------------------------------*/
void usage (char *pgm) {
    printf ("usage: %s [-h?v] [-k key] [-m message]\n\
      h|? = this helptext\n\
      k   = key\n\
      m   = message\n\
      v   = verbose\n\n",pgm);
    return;
}

드라이버 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, $funcSig, $omSig);
#unix my $DgstCmd = "echo -n \"$msg\" | openssl dgst -sha256 -hmac \"$key\"";
my $DgstCmd = "echo|set /p=\"$msg\" | openssl dgst -sha256 -hmac \"$key\"";
#documented openssl-mac is not not existent anymore
#my $MacCmd = "echo -n \"$msg\" | openssl-mac -macopt digest:SHA256 \"$key\"";
my $FuncCmd = "HmacSha256Tst -k \"$key\" -m \"$msg\"";

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

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

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

system ("openssl version");

보여주다:

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

재미있게 보내세요

관련 정보