Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Доброго времени!
Прошу совета у людей, у которых есть опыт работы с ЭЦП в веб-приложениях.
Задача стандартная, подписать документ, проверить подпись. Какими инструментами лучше это сделать? В голове много информации, личного эксперта в этом деле нет)) Нет понимания общих нюансов, что нужно для решения это задачи. Да и как вообще эта подпись к файлу подкрепляется, когда файл лежит на диске. Может есть актуальные гайды по этой теме.
Спасибо
Не в сети
Имеется в виду работа с внешним устройством (токен, HSM и т.д.) или обычная подпись закрытым ключом, проверка открытым? Если второе, то всё делается через функции OpenSSL в PHP (Laravel с какой-то версии 5.х требует openssl, так что расширение должно присутствовать).
Вкратце, есть документ, есть закрытый ключ, есть открытый ключ (ключи тоже генерируются openssl). Есть три варианта: зашифровать, подписать, зашифровать+подписать. Во всех случаях получается несколько строк с разными данными, которые для хранения/передачи могут склеиваться в одну.
iv || ciphertext
Для шифрования для многих алгоритмов требуется IV (инициализирующий вектор) — в частности, для AES. Его обычно просто ставят в начале зашифрованных данных, так как его длина фиксированная. При расшифровке делают substr($data, 0, 32) (для AES-256, где ключ 32 байта).
Подписывать можно любые данные — либо исходные (когда не стоит задачи их скрыть), либо шифрованные (когда нужно и скрыть, и аутентифицировать). Подпись (как и IV и другие строки) можно хранить в другом месте или вместе с потоком. Текстовые данные (письма и прочее) можно подписывать так, что само сообщение идёт между строчками -----BEGIN MESSAGE----- и -----END MESSAGE-----, а подпись — между -----BEGIN SIGNATURE----- и -----END SIGNATURE-----. Двоичные данные можно склеить в один поток, но сохранив длину подписи в отдельном поле (т.к. она может меняться). В случае с файлами на диске стандартная практика — не менять сам файл, а создавать новый файл с расширением .sig, как, например, здесь.
Не в сети
Спасибо за развернутый ответ! Правда, у меня задача по подписанию электронных документов посредством ЭЦП с использованием токена.
Не в сети
С токеном ситуация сложнее, так как нужен интерфейс к нему (в Laravel скорее всего его нет, особенно если это российский токен, который используется в госучреждениях/банках). Если интерфейс есть, то работа в общих чертах не отличается от работы с openssl, с той разницей, что токен выполняет часть действий внутри себя (например, ему передается строка для шифрования, а он выдает зашифрованные данные — ключ не передается, он хранится внутри токена). Детали сильно зависят от интерфейса и типа токена.
Не в сети
Спасибо, уже кое-что разузнал по этой теме)
Не в сети
@Fridz, поделишься информацией? Тоже этот вопрос встал.
Изменено DrBlack (08.08.2017 13:09:12)
Не в сети
Страницы 1