Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PHP, Perl, Python Новый топик    Ответить
 PHP: Вопрос по хешированию (подписи)  [new]
Alibek B.
Member

Откуда:
Сообщений: 3157
Мне нужно сгенерировать подпись SHA256 по ключу.
Нужна альтернатива следующей процедуры:
echo message | openssl dgst -sha256 -sign private.pem | base64 -w 0
Я использую такое выражение:
base64_encode(hash_hmac('sha256', 'message', 'private.pem', true))

Но результат (подпись) не совпадает.
Видимо потому что третий параметр функции (private.pem) воспринимается как стока, а не как закрытый ключ.
Не подскажите, как на PHP подписать данные аналогично первому выражению?
26 дек 18, 01:23    [21773500]     Ответить | Цитировать Сообщить модератору
 Re: PHP: Вопрос по хешированию (подписи)  [new]
Alibek B.
Member

Откуда:
Сообщений: 3157
И сам себе отвечаю.
Сделал такую функцию:
private function sign($data)
{
	$pkey = openssl_pkey_get_private('file://private.pem');
	openssl_sign($data, $sign, $pkey, OPENSSL_ALGO_SHA256);
	openssl_free_key($pkey);
	return base64_encode($sign);
}

Подписывает, как мне требуется.
26 дек 18, 01:34    [21773503]     Ответить | Цитировать Сообщить модератору
 Re: PHP: Вопрос по хешированию (подписи)  [new]
Alibek B.
Member

Откуда:
Сообщений: 3157
Не подскажите то же самое, но для Perl?
В Perl есть модуль Digest::SHA, в нем есть функция hmac_sha256_base64.
Но ее результат не совпадает с тем, что выдает openssl, он гораздо короче. Видимо это хеш, а не подпись.
8 июн 19, 13:54    [21905134]     Ответить | Цитировать Сообщить модератору
 Re: PHP: Вопрос по хешированию (подписи)  [new]
Hett
Member

Откуда: Бийск, Новосибирск
Сообщений: 13546
hmac - это хеш
8 июн 19, 15:01    [21905144]     Ответить | Цитировать Сообщить модератору
 Re: PHP: Вопрос по хешированию (подписи)  [new]
Alibek B.
Member

Откуда:
Сообщений: 3157
Да, напутал.
Сделал такую функцию:
sub _sign($)
{
        my $data = shift;
        open my $fh, '<', 'private.pem';
        read $fh, my $pkey, -s $fh;
        close $fh;
        use Crypt::OpenSSL::RSA;
        my $rsa = Crypt::OpenSSL::RSA->new_private_key($pkey);
        $rsa->use_sha256_hash();
        return encode_base64($rsa->sign($data), 0);
}

Ничего не напутал? Модуль на CPAN документирован очень невнятно.
Вроде бы все правильно, но почему-то подпись, которую я получаю, не совпадает с эталонной.
8 июн 19, 15:05    [21905148]     Ответить | Цитировать Сообщить модератору
 Re: PHP: Вопрос по хешированию (подписи)  [new]
Alibek B.
Member

Откуда:
Сообщений: 3157
Вот код на PHP, который все делает правильно:
function test()
{
  $data = "abc123";
  $pkey = openssl_pkey_get_private('file://'.self::IVI_API_KEY);
  openssl_sign($data, $sign, $pkey, OPENSSL_ALGO_SHA256);
  openssl_free_key($pkey);
  return base64_encode($sign);
}

Он выдает такой результат:

YnL0xqr8KjWb92brJ0TuCJRkEe7EnlocxOfaxF+r
N5zBHDw+Gh07X0bqzLKgIbbNG0gfpmog/rpPZEsK
3whxzsGDRdMdHc5NKV/RnwMx64l7tGboo84ftOwl
5E/sIGAz5nfne9gWprFgX8131Yex/bir4/ZFMJE8
v8TFhKIgFDezt+PcJdfjykN0t5vqymX5tpI0SW6x
zhdp6gz7KXDt5lHn1dFUpBOMR00VT42pl+q66sW/
FDAMmdPk9vqpHO2dA5+MXXhpLF2QeJkNeBaV0dg9
ekEx8GJUwDuwypzZuqigmbIjVVtCVpNKPOzp6WqJ
uhqyR//9RU+ZY1Uayt5LLBFOKH3UEmC6csfRWw8T
l6GNjQvsdJ32LZU0Ke5z8/Kl7GESM0RBfEJExKo1
DXAqDSdmLqFyna0UhlRpdBDS0Z25/NmQEQkPVBcc
Gv8aXn/JaU7t/yjS9G5nij6ifj/JNWgnFIW6+QUh
BK4vGaxvAUcS1enwGcEBEYZ32aTCKZE/puFg2ZHB
iOVMUjSvoPRnAH9KX3l9DIJBKRmP85R/gdjpH9+P
2LSTspIl1S2D24irw5OulFtUHHdgrWoA3W6RKTvO
NPfXqt1k7jgMN5w0kgYCZQ6H/JvXnH5vyxVnS5Pw
VhzNjneKbbNudy9YIJJT74sASr4BtDlxDvqkwnII
qpI=

Вот аналогичный код на Perl:
sub _sign($)
{
  my $data = shift;
  open my $fh, '<', $cfg->{'api'}->{'key'};
  read $fh, my $pkey, -s $fh;
  close $fh;
  use Crypt::OpenSSL::RSA;
  my $rsa = Crypt::OpenSSL::RSA->new_private_key($pkey);
  $rsa->use_sha256_hash();
  return encode_base64($rsa->sign($data), 0);
}

Результат почему-то немного отличается:

YnL0xqr8KjWb92brJ0TuCJRkEe7EnlocxOfaxF+r
N5zBHDw+Gh07X0bqzLKgIbbNG0gfpmog/rpP0ZEs
K3whxzsGDRdMdHc5NKV/RnwMx64l7tGboo84ftOw
l5E/sIGAz5nfne9gWprFgX8131Yex/bir04/ZFMJ
E8v8TFhKIgFDezt+PcJdfjykN0t5vqymX5tpI0SW
6xzhdp6gz7KXDt5lHn1dFUpBOMR00V0T42pl+q66
sW/FDAMmdPk9vqpHO2dA5+MXXhpLF2QeJkNeBaV0
dg9ekEx8GJUwDuwypzZuqigmbIj0VVtCVpNKPOzp
6WqJuhqyR//9RU+ZY1Uayt5LLBFOKH3UEmC6csfR
Ww8Tl6GNjQvsdJ32LZU0Ke5z08/Kl7GESM0RBfEJ
ExKo1DXAqDSdmLqFyna0UhlRpdBDS0Z25/NmQEQk
PVBccGv8aXn/JaU7t/yjS09G5nij6ifj/JNWgnFI
W6+QUhBK4vGaxvAUcS1enwGcEBEYZ32aTCKZE/pu
Fg2ZHBiOVMUjSvoPRn0AH9KX3l9DIJBKRmP85R/g
djpH9+P2LSTspIl1S2D24irw5OulFtUHHdgrWoA3
W6RKTvONPfXqt1k07jgMN5w0kgYCZQ6H/JvXnH5v
yxVnS5PwVhzNjneKbbNudy9YIJJT74sASr4BtDlx
DvqkwnIIqpI=0

Из-за чего получается разница?
8 июн 19, 18:25    [21905205]     Ответить | Цитировать Сообщить модератору
 Re: PHP: Вопрос по хешированию (подписи)  [new]
Alibek B.
Member

Откуда:
Сообщений: 3157
Кстати, дифф выглядит довольно необычно.

К сообщению приложен файл. Размер - 61Kb
8 июн 19, 18:31    [21905206]     Ответить | Цитировать Сообщить модератору
 Re: PHP: Вопрос по хешированию (подписи)  [new]
Alibek B.
Member

Откуда:
Сообщений: 3157
Похоже вся разница в том, что во втором варианте каждые 76 символов добавляется лишний 0.
8 июн 19, 18:33    [21905207]     Ответить | Цитировать Сообщить модератору
 Re: PHP: Вопрос по хешированию (подписи)  [new]
Alibek B.
Member

Откуда:
Сообщений: 3157
Все, вопрос решился, проблема была не в крипто-функциях, а в кодировании в base64.
У функции encode_base64 второй аргумент — это не количество символов в строке, а символ, добавляемый в конце строки. И значение 0 интерпретировалось как "0".
8 июн 19, 18:37    [21905209]     Ответить | Цитировать Сообщить модератору
Все форумы / PHP, Perl, Python Ответить