Назначение KeyInfo в XML-подписи

Я читаю о XML-подписи на странице w3.

Насколько я понимаю, для подписи XML:

  1. Создайте канонический XML XML-данных, которые необходимо подписать.
  2. Создайте хэш (дайджест) канонизированных XML-данных, используя алгоритм, упомянутый в <DigestMethod/>. Хэш пойдет внутрь <DigestValue>
  3. Шифрование выше использует алгоритм, упомянутый в <SignatureMethod/>. Этот алгоритм будет принимать закрытый ключ отправителя в качестве входных данных. Подпись будет внутри <SignatureValue>

Для проверки (на стороне получателя):

  1. Используйте открытый ключ отправителя в содержимом <SignatureValue>, чтобы получить хэш.
  2. Вычислить хэш данных (xPath/ссылку на данные можно найти в <Reference>), используя алгоритм <DigestMethod>
  3. Проверьте, совпадает ли это с хэшем в <DigestValue>

Мои вопросы:

  1. Правильно ли я понимаю?
  2. Какова роль <KeyInfo> в проверке подписи, если для проверки достаточно открытого ключа отправителя?

person dasfdsa    schedule 05.05.2018    source источник
comment
Привет @SKG, если какой-либо из ответов был полезен или верен, вы можете проголосовать, принять его или оставить отзыв. Это не обязательно, но помогает поддерживать сайт и получать более качественные ответы.   -  person pedrofb    schedule 09.05.2018


Ответы (2)


Насколько я понимаю, для подписи XML:

  1. Создайте канонический XML XML-данных, которые необходимо подписать.

  2. Создайте хэш (дайджест) канонизированных XML-данных, используя алгоритм, упомянутый в . Хэш пойдет внутрь

  3. Шифрование выше использует алгоритм, упомянутый в . Этот алгоритм будет принимать закрытый ключ отправителя в качестве входных данных. Подпись останется внутри

Это неверно, см. раздел 3.1.2 Генерация подписи указанной вами ссылки.

<SignatureValue> вычисляется по канонизированному содержимому узла <SignedInfo>, которое включает <SignatureMethod>, <CanonicalizationMethod> и ссылки. Элемент <Reference> содержит элементы <DigestMethod> и <DigestValue>.

Документ не зашифрован, он подписан закрытым ключом. Он включает аналогичную криптографическую операцию, но механизм заполнения отличается. См. https://crypto.stackexchange.com/questions/15997/is-rsa-encryption-with-a-private-key-the-same-as-signature-generation

Какова роль <KeyInfo> в проверке подписи, если для проверки достаточно открытого ключа отправителя?

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

Проверяющая сторона может проверить подпись, используя открытый ключ подписавшего, не извлекая его из элемента <KeyInfo>, но это подразумевает, что получатель сохранил открытые ключи каждого подписывающего. Проверяющая сторона обычно имеет список доверенных центров сертификации и проверяет, был ли сертификат подписи выдан одним из этих центров.

Обратите внимание, что ссылка на <KeyInfo> также включена в раздел <SignedInfo>, чтобы точно знать, какой сертификат подписал документ (открытый ключ может быть включен в несколько сертификатов).

person pedrofb    schedule 05.05.2018
comment
Спасибо за Ваш ответ. Я застрял в некоторых других вещах. - person dasfdsa; 09.05.2018

Какова роль <KeyInfo> в проверке подписи, если для проверки достаточно открытого ключа отправителя?

Ключ должен быть где-то, верно? И это место. Он будет содержать ключ для проверки подписи. Как указано в спецификации, можно пропустить элемент <KeyInfo>:

Если KeyInfo опущено, ожидается, что получатель сможет идентифицировать ключ на основе контекста приложения.

Поэтому, когда <KeyInfo> отсутствует, приложение/пользователь должен получить ключ откуда-то еще.

person Progman    schedule 05.05.2018
comment
Это не открытый ключ. Это своего рода сертификат подписи, выдаваемый получателем. - person dasfdsa; 05.05.2018