Как на PHP проверить подпись PKCS7? С помощью CryproPro Browser Plugin подписываем данные (данные в подпись не включаются) и передаем данные и подпись на сервер. Как на backend'е с помощью PHP проверить подпись?
Тестовый пример:
Подписываемые данные:
MTIz
Подпись:
MIIHrwYJKoZIhvcNAQcCoIIHoDCCB5wCAQExDDAKBgYqhQMCAgkFADALBgkqhkiG9w0BBwGgggWO
MIIFijCCBTmgAwIBAgIKFa5nHQAAAAAAEzAIBgYqhQMCAgMwVzELMAkGA1UEBhMCUlUxSDBGBgNV
BAMTP0NlbnRlci1JbmZvcm0gVGVzdCBHb3N0IENBIGZvciBBdXRvbWF0ZWQgQ2VydGlmaWNhdGlv
biBTZXJ2aWNlczAeFw0xNjA0MjkxMTU2MDBaFw0xNjA1MjkxMjA2MDBaMIICATEYMBYGCCqFAwOB
DQEBEgo3ODI3MDEwMDAwMRYwFAYFKoUDZAMSCzE0MTQ2NTk0NDYwMRgwFgYFKoUDZAESDTEwMzc4
MDAwMDY1MjkxGjAYBggqhQMDgQMBARIMMDAwMDAwMDAwMDAwMSgwJgYJKoZIhvcNAQkBFhlrLnZh
Z25lckBjZW50ZXItaW5mb3JtLnJ1MQswCQYDVQQGEwJSVTEtMCsGA1UECAwkNzgg0LMuINCh0LDQ
vdC60YIt0J/QtdGC0LXRgNCx0YPRgNCzMQowCAYDVQQHDAEwMTMwMQYDVQQKDCrQntCe0J4gIjEy
0KLQtdGB0YLQvtCy0LDRjyDQktCw0LPQvdC10YAxMiIxCjAIBgNVBAsMATAxMzAxBgNVBAMMKtCe
0J7QniAiMTLQotC10YHRgtC+0LLQsNGPINCS0LDQs9C90LXRgDEyIjEKMAgGA1UECQwBMDEwMC4G
CSqGSIb3DQEJAgwhMDAwMDAwMDAwMC03ODA0MDEwMTItNzAxNzA4OTAzMzA3MSwwKgYDVQQMDCPQ
ktC10LTRg9GJ0LjQuSDRgdC/0LXRhtC40LDQu9C40YHRgjEsMCoGA1UEKgwj0JrRgdC10L3QuNGP
INCT0YDQuNCz0L7RgNGM0LXQstC90LAxFTATBgNVBAQMDNCS0LDQs9C90LXRgDBjMBwGBiqFAwIC
EzASBgcqhQMCAiQABgcqhQMCAh4BA0MABEDQ+qVSBmQT0pLQktgaiF4eYRhHCkj4dgysTY6yGwqY
f3YO5ErwQEP551bi2cUWSAD56nUtMCmRSVdm/LTwXNgvo4ICNzCCAjMwDgYDVR0PAQH/BAQDAgTw
MFYGA1UdJQRPME0GCCsGAQUFBwMCBggrBgEFBQcDBAYHKoUDAgIiBgYHKoUDAwcIAQYIKoUDAwcB
AQEGBiqFAwMHAQYKKwYBBAGCNxQCAgYHKoUDAwYAATARBgUqhQNkbwQIDAZmZ2JkZmcwJwYDVR0R
BCAwHqQcMBoxGDAWBggqhQMDgQ0BARMKNzgyNzAxMDAwMDAdBgNVHQ4EFgQUcptDmJmnjCYFiHYT
qUV3uzpe154wHwYDVR0jBBgwFoAUu5WQXMfu/Sh+KvktbnKGhg+UzbowgYQGA1UdHwR9MHsweaB3
oHWGc2ZpbGU6Ly9XSU4tVkgzMDBRUTFPRTEvY2VydGVucm9sbC9DZW50ZXItSW5mb3JtJTIwVGVz
dCUyMEdvc3QlMjBDQSUyMGZvciUyMEF1dG9tYXRlZCUyMENlcnRpZmljYXRpb24lMjBTZXJ2aWNl
cy5jcmwwgaMGCCsGAQUFBwEBBIGWMIGTMIGQBggrBgEFBQcwAoaBg2ZpbGU6Ly9XSU4tVkgzMDBR
UTFPRTEvY2VydGVucm9sbC9XSU4tVkgzMDBRUTFPRTFfQ2VudGVyLUluZm9ybSUyMFRlc3QlMjBH
b3N0JTIwQ0ElMjBmb3IlMjBBdXRvbWF0ZWQlMjBDZXJ0aWZpY2F0aW9uJTIwU2VydmljZXMuY3J0
MCAGBSqFA2RwBBcwFQwEZGZnYgwDZmdiDANmZ2IMA2RmZzAIBgYqhQMCAgMDQQDrI0ZZv4spqkAE
FgMctJ0u/alxpARIoas+EykdxXHNhsI+qo6dNUvlDcU6iumt2vneS1Roae5JpXxONR0xhCAaMYIB
6DCCAeQCAQEwZTBXMQswCQYDVQQGEwJSVTFIMEYGA1UEAxM/Q2VudGVyLUluZm9ybSBUZXN0IEdv
c3QgQ0EgZm9yIEF1dG9tYXRlZCBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzAgoVrmcdAAAAAAATMAoG
BiqFAwICCQUAoIIBHDAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0x
NjA1MjMxMDU5NTlaMC8GCSqGSIb3DQEJBDEiBCBe8YSJYXui2NLX4No4mqpP8CKtAaOVEqT+oajE
XkORSDCBsAYLKoZIhvcNAQkQAi8xgaAwgZ0wgZowgZcwCAYGKoUDAgIJBCAgZs3V6/iQi9GkX/56
BRMSGZJBQzzqS5IumTyjlmWxuTBpMFukWTBXMQswCQYDVQQGEwJSVTFIMEYGA1UEAxM/Q2VudGVy
LUluZm9ybSBUZXN0IEdvc3QgQ0EgZm9yIEF1dG9tYXRlZCBDZXJ0aWZpY2F0aW9uIFNlcnZpY2Vz
AgoVrmcdAAAAAAATMAoGBiqFAwICEwUABED8RT4JumVC2gUtGoMaemycUrRoysXZ7NOw++429MDg
Yj/k8VjwJdqvrNMiWnrEThkiQXLufj5fyADrtv6W5R9p

21 Авг 2019 в 07:13
178 +1
1
Ответы
1

Для проверки подписи PKCS7 на PHP можно использовать функцию openssl_pkcs7_verify. Пример кода для проверки подписи:

// Подписываемые данные
$data = 'MTIz';
// Подпись
$signature = 'MIIHrwYJKoZIhvcNAQcCoIIHoDCCB5wCAQExDDAKBgYqhQMCAgkFADALBgkqhkiG9w0BBwGgggWOMIIFijCCBTmgAwIBAgIKFa5nHQAAAAAAEzAIBgYqhQMCAgMwVzELMAkGA1UEBhMCUlUxSDBGBgNVBAMTP0NlbnRlci1JbmZvcm0gVGVzdCBHb3N0IENBIGZvciBBdXRvbWF0ZWQgQ2VydGlmaWNhdGlvbiBTZXJ2aWNlczAeFw0xNjA0MjkxMTU2MDBaFw0xNjA1MjkxMjA2MDBaMIICATEYMBYGCCqFAwOB...
// Конвертируем данные в нужный формат
$data = base64_decode($data);
$signature = base64_decode($signature);
// Сохраняем данные и подпись во временные файлы
$fileData = tempnam(sys_get_temp_dir(), 'data');
file_put_contents($fileData, $data);
$fileSignature = tempnam(sys_get_temp_dir(), 'signature');
file_put_contents($fileSignature, $signature);
// Проверяем подпись
$certificates = [];
$empty = [];
$result = openssl_pkcs7_verify($fileData, PKCS7_NOINTERN | PKCS7_NOCERTS, $fileSignature, $certificates, $empty);
if ($result) {
echo "Подпись верна";
} else {
echo "Подпись не верна";
}
// Удаляем временные файлы
unlink($fileData);
unlink($fileSignature);

Обратите внимание, что в данном коде используется временное сохранение данных и подписи в файлах для проверки. В реальной ситуации это может быть оптимизировано, например, через использование встроенных функций для работы с потоками.

20 Апр в 13:05
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 588 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир