Как подписать данные в PHP с HMAC, используя закрытый ключ PEM

Я видел много постов о том, как создать HMAC в PHP, но используемый секрет всегда был простой строкой (например, «секрет»). Что мне нужно сделать, так это создать HMAC с секретным секретным ключом, загруженным, например, из файла, содержащего секретный ключ в формате PEM. Мне не удалось найти какую-либо информацию о том, возможно ли это в PHP (с помощью hash_hmac) или нет.

использование

Подпись HmacSHA256 с использованием закрытого ключа создается в Java, и я хотел бы воссоздать эту подпись в PHP (насколько я понимаю, используя hash_hmac с алгоритмом хеширования sha256) с тем же закрытым ключом, загруженным из файла.

Чтобы уточнить:
закрытый ключ в этом сценарии используется как общий секретный ключ, то есть ключ есть у двух сторон. Процесс проверки сообщения состоит из отправки HMAC с сообщением, рассчитанным с использованием закрытого ключа, в то время как получатель вычисляет HMAC с идентичным закрытым ключом и проверяет его по отправленной подписи.

Код

Джава:

byte[] data = getDataForSignature();
PrivateKey key = getPrivateKey(); // loaded from a file
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(key);
byte[] hmac = mac.doFinal(data);
// compare hmac with received signature bytes

PHP:

$key = openssl_pkey_get_private("private.key");
$sig = hash_hmac("sha256", $data, $key??, true);

Пример закрытого ключа

-----BEGIN RSA PRIVATE KEY-----
MIICXgIBAAKBgQCSWro05ZKVGxMTCqAyNZRAXp8Gd7wf6vywXRsFckm9MHOAWZL0
SvFAhM6tlCthuPkQb0c+Hx9PWH1+4sW2u3O+VDvjQEB0ZILd79LraBEshK/36Oux
yyw2K+ghk9Yh00nJOzkkonmdZmVxr0AAzw5el2h9yDjlUa1E8BH/1LzBBwIDAQAB
AoGANtwXbHiZh5bMgZi8D9YRqkdNqOj89aHp8loUJOiAR5B/2x64fSYSZLLjniEq
WckyYzyzIdActmtfL07l+ecuLRipsHoHuzjPiiRRnzJQbgBstnB8rHkuN275YSbC
3gE7nyyX0JPEviwqHv++Uig0RCD1ZbrG0SBMKBlGVrFMddECQQDmVguRhRScTJHH
RaXY/zjZtHp0L1dtzzSLM75+ji2UoRy1yK9z+rnE1PM5QC8PQixbwocGwpRIwGQn
hIg1YAM9AkEAoqk+VNbJ9ykoP9r+8o1PrPR1Ff+EIhpTthRyFngHNbNnOFB0D314
+V4wyO+a/gbiIAmvTuOXV/GwOlgnfVDJkwJBAJNHd5QvxPL/3sLNXPN4ljBWP2pl
DwFO2Wkcx/SCEtETh5kQ3mdJbVlXVMJJsQ2PoW923gHLjydJpYDDNJj0cH0CQQCW
8txHOvQ+C9GwQHirenvgExO9EFv8kdXxeNPPCiAWs6AsYGz0Gwpyz/gR4FlDN/wM
ozAu04IVONLDsh8jah9FAkEAsSUvlo7Nh1ITd75kUsStv7Tjxma3SuKViewWCprD
olDNtncfcZC5SrilHAJEabVxGy1fJL3hYvTYfqNkeB1TcA==
-----END RSA PRIVATE KEY-----

1

Решение

Обычно закрытый ключ используется для выполнения генерация подписи который является асимметричным эквивалентом создания MAC с симметричным секретным ключом.

Обратите внимание, что ключ HMAC может состоять из любой двоичной строки, поэтому в принципе было бы возможно использовать HMAC с двоичным кодированным закрытым ключом. Тем не менее, не имеет смысла использовать асимметричный закрытый ключ для HMAC. Только лицо, обладающее закрытым ключом, сможет проверить полученный тег аутентификации. Для сравнения, цифровые подписи могут быть проверены с использованием открытого ключа пары ключей.


Теперь, если у вас есть секрет ключ, который был использован в Java, то вам нужно создать тот же (двоичный) key параметр для PHP hash_hmac функция.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]