Если под «исходной версией файла» вы имеете в виду, что вы намереваетесь «заморозить» документ, чтобы никто никогда не мог снова внести в него изменения - это невозможно и не является целью цифровой подписи. Любой может просто «вырезать» подпись, встроенную в документ, никто не заметит.
Защита документа от последующей модификации включает в себя некоторый механизм DRM. Например, «водяные знаки», включающие стеганографию, используются для защиты фотографий, чтобы никто не мог претендовать на право собственности на фотографию, даже после ее изменения. Но технология еще не очень продвинута, большинство алгоритмов можно легко сломать.
Это подразумевает, что понятие «оригинальная версия файла» в, скажем, юридическом споре - это то, с чем вовлеченные стороны должны согласовать согласие. Нет никакого способа доказать происхождение без согласия или доверенной третьей стороны, которая засвидетельствует целостность документа, например, если у них есть независимая копия документа.
Кроме того, загрузка файла не должна изменять его содержимое. Файл будет иметь те же свойства, что и локальный, включая подпись, добавленную на стороне клиента.
Подпись будет свидетельствовать только о подлинности и целостности документа. Если для вашего приложения жизненно важно иметь возможность сказать, что полученный подписанный документ действительно является ожидаемым, то я бы посоветовал вам сделать следующее:
- Создание PDF на сервере
- Создать хеш документа (тот же алгоритм, который будет использоваться апплетом подписи)
- Отправить PDF клиенту
- Позвольте клиенту подписать его и отправить обратно
- Сравните хеш клиента с ранее вычисленным на сервере
- Проверить подпись
Проверка подписи обеспечит целостность и подлинность, сравнение хешей гарантирует, что подписанный документ, полученный на сервере, действительно является подписанной версией исходного документа, созданного ранее.
Что касается отметок времени с использованием локальных часов: они бесполезны, их очень легко обмануть. То, что вы на самом деле должны использовать, это RFC 3161 -совместимые криптографически защищенные метки времени, выпущенные доверенной третьей стороной. В настоящее время это единственный надежный способ включить понятие времени в подписи PDF. Например, есть встроенная поддержка для этого в Adobe Reader. Поскольку эти службы, как правило, не доступны бесплатно, имеет смысл добавить такую временную метку на сервер после получения подписанного документа. Они добавляются в качестве неподписанного атрибута в подпись CMS (Adobe все еще говорит о PKCS7), поэтому она не нарушит подпись и может быть безопасно добавлена после создания подписи.