Подписание HTML-документов с использованием PGP или SSL через веб-формы

Допустим, у меня есть контракт между двумя сторонами, опубликованный в Интернете. Я хочу, чтобы обе стороны могли подписать контракт, чтобы показать, что они согласны с условиями, как они это сделали бы с почерком в реальной жизни. Я видел много соглашений TOS в Интернете, где это делается с помощью только флажка, но я хочу пойти еще дальше и позволить каждой стороне утверждать, что подпись принадлежит им, а не является подделкой (кто-то другой ставит флажок вместо них).

  • Предполагая, что страница уже обслуживается через HTTPS, а комбинации имени пользователя и пароля не подходят, какая криптографическая технология лучше всего подходит для проверки подлинности: PGP, SSL или что-то еще?
  • Как я могу сделать это, используя только HTML и сервер LAMP на другом конце, таким образом, чтобы процесс был максимально автоматизирован, но при этом оставался безопасным? Примеры кода приветствуются, но не обязательны; Я просто пытаюсь осмыслить это: должно ли содержание контракта быть включено в подпись? Должны ли пользователи загружать открытые ключи или что-то в этом роде? Я не эксперт по криптографии, поэтому я теряюсь.

person Hugh Guiney    schedule 19.01.2012    source источник


Ответы (1)


SSL — это механизм безопасности транспорта, он неприменим.

Вы можете использовать OpenPGP или PKI (сертификаты X.509 и формат CMS). Эти технологии позволяют подписывать данные два или более раз без аннулирования предыдущих подписей — это делается с помощью отдельных подписей.

Выбор того, что (PGP или PKI) использовать, остается за вами — эти технологии могут использоваться в аналогичных сценариях, но имеют разные способы аутентификации ключей: в PGP пользовательские ключи подписываются другими пользователями, а в PKI сертификаты подписываются центрами сертификации. , который должен вызывать больше доверия.

Когда вы «подписываете документ» с помощью криптографической подписи, с технической точки зрения это хеш документа, который подписывается. Хэш может быть рассчитан на сервере и отправлен клиенту для подписи, после чего отсоединенная подпись передается обратно на сервер. Так вы сможете хранить документ на сервере, а приватные ключи, используемые для подписи, не покинут клиента.

Однако для фактической подписи на клиенте вам нужен какой-то модуль, который будет связываться с сервером и выполнять работу. Вы не можете работать только с веб-браузером - требуется какой-то плагин для браузера. Причина в том, что «криптография» Javascript, даже если она технически разрешает доступ к ключам на стороне клиента, хранящимся в файлах или на криптографических устройствах, имеет определенные концептуальные недостатки, которые делают ее практически бесполезной. Таким образом, вы в конечном итоге используете что-то более надежное и безопасное, то есть подписанный апплет, элемент управления ActiveX или скрипт Flash.

Наша компания предоставляет различные компоненты безопасности, среди которых есть компоненты и модули для распределенной подписи (включая вышеупомянутые плагины). Эти модули предназначены для операций PKI (хотя обычно у нас также есть компоненты для операций OpenPGP, эти компоненты в настоящее время не поддерживают распределенную подпись).

И я должен отметить, что «автоматизация» здесь возможна до такой степени, когда пользователь выбирает сертификат для использования и нажимает кнопку «подписать» (например). Вы не можете ничего подписать без явного действия пользователя. В некоторых случаях пользователю также потребуется предоставить PIN-код/пароль, который защищает закрытый ключ от неправомерного использования.

person Eugene Mayevski 'Callback    schedule 19.01.2012
comment
Ах, верно, я объединил SSL и X.509 и т. д. из-за OpenSSL… Так можно ли было бы тогда хешировать документ, когда он также содержит форму, которую нужно заполнить? Разве это не изменяет документ и не делает недействительным любой предыдущий хэш? Должен ли это быть двухэтапный процесс? Или текст документа должен храниться отдельно от входных данных? - person Hugh Guiney; 20.01.2012
comment
@HughGuiney Ответ зависит от формата документа и формата подписи. Например, PDF предлагает способ подписать документ, оставив форму пустой и доступной для заполнения. В то же время формат подписи PDF не позволяет подписывать документы двумя независимыми подписями. Я согласен, что это большой пробел (или недостаток), который препятствует более широкому использованию электронных подписей. - person Eugene Mayevski 'Callback; 20.01.2012
comment
@HughGuiney Итак, я вижу только следующее решение: один создает предварительно заполненный документ без подписи и помещает в него имена обеих сторон, затем обе стороны подписывают его независимо. Альтернативой может быть хранение закрытого ключа на сервере, и когда пользователь хочет поставить подпись, вы создаете предварительно заполненный документ, подписываете его на лету своим ключом, а затем продолжаете подписку пользователя. - person Eugene Mayevski 'Callback; 20.01.2012
comment
(+1 уже) @HughGuiney, помимо аспекта криптовалюты, сделать это удобным для пользователя способом может быть проблемой. Довести большинство пользователей до понимания того, как работают сертификаты и как обращаться с их закрытыми ключами, уже довольно сложно. Объяснение того, откуда они получают свой сертификат (и где он хранится, возможно, в браузере) и его использование из другого приложения/апплета, может сбивать с толку. Возможно, продукты Евгения помогут сделать всю интеграцию более плавной для пользователя (я их не пробовал). - person Bruno; 20.01.2012
comment
@Bruno, вероятно, они не делают его намного более плавным, но они избавляют разработчика от разработки клиент-серверных вещей и позволяют ему реализовывать собственный графический интерфейс для клиентских модулей так, как он выбирает. - person Eugene Mayevski 'Callback; 20.01.2012