powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP: Вопрос по хешированию (подписи)
9 сообщений из 9, страница 1 из 1
PHP: Вопрос по хешированию (подписи)
    #39753184
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне нужно сгенерировать подпись SHA256 по ключу.
Нужна альтернатива следующей процедуры:
Код: plaintext
echo message | openssl dgst -sha256 -sign private.pem | base64 -w 0
Я использую такое выражение:
Код: php
1.
base64_encode(hash_hmac('sha256', 'message', 'private.pem', true))


Но результат (подпись) не совпадает.
Видимо потому что третий параметр функции (private.pem) воспринимается как стока, а не как закрытый ключ.
Не подскажите, как на PHP подписать данные аналогично первому выражению?
...
Рейтинг: 0 / 0
PHP: Вопрос по хешированию (подписи)
    #39753185
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И сам себе отвечаю.
Сделал такую функцию:
Код: php
1.
2.
3.
4.
5.
6.
7.
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);
}


Подписывает, как мне требуется.
...
Рейтинг: 0 / 0
PHP: Вопрос по хешированию (подписи)
    #39824421
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не подскажите то же самое, но для Perl?
В Perl есть модуль Digest::SHA, в нем есть функция hmac_sha256_base64.
Но ее результат не совпадает с тем, что выдает openssl, он гораздо короче. Видимо это хеш, а не подпись.
...
Рейтинг: 0 / 0
PHP: Вопрос по хешированию (подписи)
    #39824429
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hmac - это хеш
...
Рейтинг: 0 / 0
PHP: Вопрос по хешированию (подписи)
    #39824432
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, напутал.
Сделал такую функцию:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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 документирован очень невнятно.
Вроде бы все правильно, но почему-то подпись, которую я получаю, не совпадает с эталонной.
...
Рейтинг: 0 / 0
PHP: Вопрос по хешированию (подписи)
    #39824474
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот код на PHP, который все делает правильно:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
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);
}


Он выдает такой результат:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
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:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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);
}


Результат почему-то немного отличается:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
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

Из-за чего получается разница?
...
Рейтинг: 0 / 0
PHP: Вопрос по хешированию (подписи)
    #39824475
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, дифф выглядит довольно необычно.
...
Рейтинг: 0 / 0
PHP: Вопрос по хешированию (подписи)
    #39824476
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже вся разница в том, что во втором варианте каждые 76 символов добавляется лишний 0.
...
Рейтинг: 0 / 0
PHP: Вопрос по хешированию (подписи)
    #39824477
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все, вопрос решился, проблема была не в крипто-функциях, а в кодировании в base64.
У функции encode_base64 второй аргумент — это не количество символов в строке, а символ, добавляемый в конце строки. И значение 0 интерпретировалось как "0".
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP: Вопрос по хешированию (подписи)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]