Обработка подписей XML не так уж сложна, если вы хорошо знакомы с XML, но есть много деталей, которые должны быть абсолютно правильными, или что-то не работает, поэтому я, вероятно, не стал бы пытаться написать свою собственную реализация в этой ситуации (я реализовал это частично один раз, но это было для другой и специальной цели, и в любом случае это не было полной реализацией).
В любом случае, я мало что знаю о SAML, но я знаю о XML и XML-сигнатурах, так что, возможно, я смогу помочь вам, попробовав ответить на ваши вопросы.
Элемент Signature
относится к конкретному фрагменту документа XML с цифровой подписью в его дочернем элементе SignedInfo
. Дочерний элемент Reference
этого (я думаю, что может быть много элементов Reference
, которые сцепляются при формировании байтов для подписи, но я уже не помню точно) указывает на содержимое с помощью атрибута URI
. Элементы Transform
описывают преобразования, выполняемые с указанным контентом перед его хэшированием; вам нужно будет взглянуть на спецификации, чтобы понять, как определяются алгоритмы преобразования. Элемент DigestMethod
предоставляет алгоритм хеширования, который применяется к байтам, которые являются результатом этих алгоритмов преобразования (обратите внимание, что одним из них всегда является канонизация, которая преобразует XML в байты), а DigestValue
дает результат этого алгоритма дайджеста. .
Фактическая подпись находится в элементе SignatureValue
и создается путем применения канонизации элемента CanonicalizationMethod
для создания байтов и последующей подписи этих байтов с помощью SignatureMethod
. Элемент KeyInfo
сообщает вам, как найти ключ для использования.
Канонизация, которая появляется пару раз выше, - это просто способ преобразования XML-документа в байты, чтобы «эквивалентные» XML-документы создавали одинаковую последовательность байтов. Это требуется для цифровой подписи, поскольку алгоритмы работают с байтами, а XML может проходить через ряд посредников, которые, вероятно, нарушат исходные байты, но сохранят эквивалентность. И разные методы канонизации необходимы для разных ситуаций: если элементы извлекаются из документов и помещаются в другие, вам нужна исключительная канонизация, которая удаляет ненужные определения пространства имен, но в других случаях это может работать некорректно, поэтому вместо этого вам нужна инклюзивная канонизация, которая сохраняет все пространства имен в области.
Это всего лишь основы. Существует несколько различных способов создания XML-подписи, и если вы хотите реализовать работающий верификатор, вам необходимо рассмотреть все из них. Поскольку вы новичок в XML в целом, я просто повторю свой совет по использованию того, что уже существует. Реализация спецификации представляет собой интересный опыт обучения, но часто это пустая трата времени, если реализации уже доступны.
Имеется документация W3C о подписи.