Поле алгоритма подписи пусто, поле алгоритма хеширования пусто

Обновлено: 02.07.2024

TS 119 102-1 (4.2.8 Представление данных для подписи (DTBSR)) : компонент подготовки DTBS должен взять DTBSF и хешировать его в соответствии с алгоритмом хеширования, указанным в криптографическом наборе.

Возвращает элемент ссылки на подпись, как определено в TS 119 442 – V1.1.1 – Электронные подписи и инфраструктуры (ESI), гл.

Этот метод возвращает список документов для механизмов ObjectIdByUrl или ObjectIdByUriHash. Сохраняет исходный порядок в соответствии с содержимым словаря 'pars'

Методы, унаследованные от класса eu.europa.esig.dss.validation.DefaultAdvancedSignature

Методы, унаследованные от класса java.lang.Object

Сведения о конструкторе

Подпись JAdESS

Сведения о методе

получитьJws

получить форму подписи

Алгоритм получения подписи

получить алгоритм шифрования

алгоритм getDigest

получитьMaskGenerationFunction

получить время подписи

isDetachedSignature

получитьMasterCSigComponent

setMasterCSigComponent

получить источник сертификата

получитьCRLSource

получитьOCSPSource

получить временную метку

getSignatureProductionPlace

получитьSignaturePolicyStore

получить Индикацию ТипаОбязательства

получитьContentType

получитьMimeType

получитьCertifiedSignerRoles

getClaimedSignerRoles

получить подписанные утверждения

получитьCounterSignatures

получитьDAIdentifier

построить политику подписи

получить значение подписи

получитьEtsiUHeader

getSignatureDigestReference

Возвращает элемент ссылки на подпись, как определено в TS 119 442 — V1.1.1 — Электронные подписи и инфраструктуры (ESI), гл. 5.1.4.2.1.3 Компонент XML

getDataToBeSignedRepresentation

TS 119 102-1 (4.2.8 Представление данных для подписи (DTBSR)) : компонент подготовки DTBS должен взять DTBSF и хешировать его в соответствии с алгоритмом хеширования, указанным в криптографическом наборе.

получитьSignatureIdentifierBuilder

проверить целостность подписи

Проверяет целостность подписи; проверяет, не был ли подделан подписанный контент. В случае подписи, отличной от AdES, без сертификата подписи, последний должен быть предоставлен путем вызова setProvidedSigningCertificateToken. В случае отдельной подписи подписанное содержимое должно быть предоставлено путем вызова setProvidedSigningCertificateToken

получитьReferenceValidations

получить ребенка

Механизм getSigD

Механизм getSignedDocumentsForObjectIdByUri

Этот метод возвращает список документов для механизмов ObjectIdByUrl или ObjectIdByUriHash. Сохраняет исходный порядок в соответствии с содержимым словаря 'pars'

получить исходные документы

getDataFoundUpToLevel

создатьBaselineRequirementsChecker

проверить структуру

добавитьвнешнюю временную метку

Этот метод позволяет добавить внешнюю метку времени. Данная метка времени должна быть обработана раньше. ПРИМЕЧАНИЕ. Этот метод поддерживается только для подписей CAdES

Во-первых, я новичок в размещении сообщений на StackOverflow, поэтому, пожалуйста, сообщите мне, если я предоставляю недостаточно информации или что-то в этом роде.

Я взаимодействую с внешней службой цифровой подписи. Я могу получить подпись и добавить ее в исходный PDF-файл с помощью iTextSharp. Adobe Acrobat правильно подхватывает; однако подпись недействительна, поскольку «документ был изменен или поврежден с момента подписания».

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

Вот мой код:

Мы будем очень признательны за любую помощь!

Основываясь на ответе mkl, я провел рефакторинг своего кода. Я выбрал второй вариант (закрытие сапа с пустой подписью и сохранение баоса с наполовину подписанным PDF). Однако я получаю (не очень описательное) исключение при вызове sap.Close(dic):

Данный ключ отсутствует в словаре. в System.ThrowHelper.ThrowKeyNotFoundException() в System.Collections.Generic.Dictionary`2.get_Item(ключ TKey) в iTextSharp.text.pdf.PdfSignatureAppearance.Close(обновление PdfDictionary)

Вот обновленный код:

1 Ответ 1

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

Вы правильно предполагаете, что хэш фиксированного документа является постоянным. В конце концов, это основной момент хеширования.

Однако вы ошибаетесь, полагая, что ваш вариант использования является примером этого. Потому что вы хешируете разные документы при каждом запуске.

В BuildAppearence каждый раз создается другой PDF-файл, потому что, в частности, текущее время сохраняется в нем как время подписания (явно с помощью вашего кода) и как время модификации документа (неявно с помощью iText). Кроме того, уникальный идентификатор создается и сохраняется в PDF (неявно iText). В зависимости от других аспектов PDF-файла может быть больше записей в PDF-файле, которые меняются от звонка к звонку.

Несмотря на то, что эти неявно заданные записи PDF в iText можно исправить, чтобы они стали инъекционными, чистый способ реализации подписи состоит в том, чтобы следовать примерам подписи iText и сохранять исходную версию PDF, а затем вставлять в нее подпись. .

Какие библиотеки уязвимы для атак и как их предотвратить.

Тим Маклин

Приглашенный автор

Последнее обновление: 21 августа 2020 г.

Какие библиотеки уязвимы для атак и как их предотвратить.

Тим Маклин

Приглашенный автор

Последнее обновление: 21 августа 2020 г.


Auth0 Marketplace
Откройте для себя и активируйте интеграции, необходимые для идентификации личности

TL;DR: если вы используете node-jsonwebtoken, pyjwt, namshi/jose, php-jwt или jsjwt с асимметричными ключами (RS256, RS384, RS512, ES256, ES384, ES512), обновите их до последней версии. См. jwt.io для получения дополнительной информации об уязвимых библиотеках. (обновлено 20 апреля 2015 г.)

Недавно, изучая безопасность различных реализаций JSON Web Token, я обнаружил множество библиотек с критическими уязвимостями, позволяющими злоумышленникам обойти этап проверки. Одни и те же две ошибки были обнаружены во многих реализациях и языках, поэтому я подумал, что было бы полезно написать, где именно возникают проблемы. Я считаю, что изменение стандарта поможет предотвратить будущие уязвимости.

Отправить твит

Для тех, кто не знаком, JSON Web Token (JWT) — это стандарт для создания токенов, подтверждающих определенное количество утверждений. Например, сервер может сгенерировать токен с утверждением «вошел в систему как администратор» и предоставить его клиенту. Затем клиент может использовать этот токен, чтобы доказать, что он вошел в систему как администратор. Токены подписываются ключом сервера, поэтому сервер может проверить подлинность токена.

JWT обычно состоит из трех частей: заголовка, полезной нагрузки и подписи.

Заголовок указывает, какой алгоритм используется для создания подписи, и выглядит примерно так:

HS256 указывает, что этот токен подписан с использованием HMAC-SHA256.

Полезная нагрузка содержит утверждения, которые мы хотим сделать:

Как указано в спецификации JWT, мы включаем временную метку iat , сокращение от "выпущено в".

Подпись вычисляется путем кодирования base64url заголовка и полезной нагрузки и объединения их с точкой в ​​качестве разделителя:

Чтобы собрать все вместе, мы base64url кодируем подпись и соединяем три части с помощью точек:

Чтобы узнать больше о веб-токенах JSON, ознакомьтесь с нашей бесплатной электронной книгой ниже.

Заинтересованы в том, чтобы как можно скорее перейти на JWT?

Отлично. Итак, что с этим не так?

Что ж, попробуем проверить токен.

Во-первых, нам нужно определить, какой алгоритм использовался для создания подписи. Нет проблем, в заголовке есть поле alg, которое говорит нам об этом.

Но подождите, мы еще не проверили этот токен, что означает, что мы не проверили заголовок. Это ставит нас в неловкое положение: чтобы проверить токен, мы должны позволить злоумышленникам выбрать, какой метод мы используем для проверки подписи.

Это имеет катастрофические последствия для некоторых реализаций.

Познакомьтесь с алгоритмом «Нет»

Алгоритм none — любопытное дополнение к JWT. Он предназначен для использования в ситуациях, когда целостность токена уже проверена. Интересно, что это один из двух обязательных для реализации алгоритмов (второй — HS256 ).

К сожалению, некоторые библиотеки рассматривают токены, подписанные с помощью алгоритма none, как допустимые токены с проверенной подписью. Результат? Любой может создать свои собственные «подписанные» токены с любыми полезными данными, что позволяет произвольный доступ к учетной записи в некоторых системах.

Собрать такой токен несложно. Измените заголовок приведенного выше примера, чтобы он содержал «alg» : «none» вместо HS256 . Внесите необходимые изменения в полезную нагрузку. Используйте пустую подпись (например, подпись = "").

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

RSA или HMAC?

Спецификация JWT также определяет ряд алгоритмов асимметричной подписи (на основе RSA и ECDSA). С помощью этих алгоритмов токены создаются и подписываются с использованием закрытого ключа, но проверяются с использованием соответствующего открытого ключа. Это довольно удобно: если вы публикуете открытый ключ, но храните закрытый ключ при себе, только вы можете подписывать токены, но любой может проверить, правильно ли подписан данный токен.

Большинство библиотек JWT, которые я просмотрел, имеют такой API:

В системах, использующих подписи HMAC, VerificationKey будет секретным ключом подписи сервера (поскольку HMAC использует один и тот же ключ для подписи и проверки):

В системах, использующих асимметричный алгоритм,verificationKey будет открытым ключом, по которому должен быть проверен токен:

К сожалению, злоумышленник может этим злоупотребить. Если сервер ожидает токен, подписанный с помощью RSA, но на самом деле получает токен, подписанный с помощью HMAC, он будет думать, что открытый ключ на самом деле является секретным ключом HMAC.

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

Это довольно просто. Сначала возьмите свою любимую библиотеку JWT и выберите полезную нагрузку для своего токена. Затем получите открытый ключ, используемый на сервере в качестве ключа проверки (скорее всего, в текстовом формате PEM). Наконец, подпишите свой токен, используя открытый ключ в формате PEM в качестве ключа HMAC. По существу:

Сложнее всего убедиться, что serverRSAPublicKey идентичен ключу проверки, используемому на сервере. Чтобы атака сработала, строки должны точно совпадать — в точном формате, без дополнительных или отсутствующих разрывов строк.

Конечный результат? Любой, кто знает открытый ключ, может подделать токены, которые пройдут проверку.

Рекомендации для разработчиков библиотек

Я предлагаю библиотекам JWT добавить параметр алгоритма в свою функцию проверки:

Сервер уже должен знать, какой алгоритм он использует для подписи токенов, и небезопасно позволять злоумышленникам предоставлять это значение.

Кто-то может возразить, что некоторые серверы должны поддерживать более одного алгоритма из соображений совместимости. При этом для каждого поддерживаемого алгоритма можно (и нужно) использовать отдельный ключ. JWT удобно предоставляет поле «идентификатор ключа» ( kid ) именно для этой цели. Поскольку серверы могут использовать идентификатор ключа для поиска ключа и соответствующего ему алгоритма, злоумышленники больше не могут контролировать способ использования ключа для проверки. В любом случае, я не думаю, что библиотеки JWT должны даже смотреть на поле alg в заголовке, за исключением, возможно, проверки того, что оно соответствует ожидаемому алгоритму.

Все, кто использует реализацию JWT, должны убедиться, что токены с другим типом подписи гарантированно будут отклонены. Некоторые библиотеки имеют необязательный механизм для алгоритмов внесения в белый или черный список; Воспользуйтесь этим, иначе вы можете оказаться в опасности. Еще лучше: разработайте политику аудита безопасности любых библиотек с открытым исходным кодом, которые вы используете для обеспечения критически важных функций.

Улучшение стандарта JWT/JWS

Я хотел бы предложить отказаться от использования поля alg в заголовке. Как мы видели здесь, его неправильное использование может иметь разрушительные последствия для безопасности реализации JWT/JWS. Насколько я могу судить, идентификаторы ключей представляют собой адекватную альтернативу. Это требует внесения изменений в спецификацию: библиотеки JWT по-прежнему пишутся с недостатками безопасности из-за их зависимости от alg .

JWT (и JOSE) предоставляют возможность иметь кросс-платформенный набор безопасных криптографических реализаций. Мы надеемся, что благодаря этим исправлениям мы немного приблизимся к тому, чтобы воплотить это в жизнь.

Кроме того: делегирование реализации JWT экспертам

JWT – это неотъемлемая часть стандарта OpenID Connect — уровня идентификации, который находится поверх платформы OAuth2. Auth0 — это сертифицированная платформа идентификации OpenID Connect. Это означает, что если вы выберете Auth0, вы можете быть уверены, что он на 100 % совместим с любой сторонней системой, которая также соответствует спецификации.

Спецификация OpenID Connect требует использования формата JWT для идентификаторов, которые содержат информацию о профиле пользователя (например, имя пользователя и адрес электронной почты), представленную в форме утверждений. Эти утверждения представляют собой утверждения о пользователе, которым можно доверять, если потребитель токена может проверить его подпись.

Хотя спецификация OAuth2 не предписывает формат токенов доступа, используемых для предоставления приложениям доступа к API от имени пользователей, в отрасли также широко используется JWT для этих целей.

Как разработчик, вам не нужно беспокоиться о непосредственной проверке, подтверждении или декодировании JWT, связанных с аутентификацией, в ваших службах. Вы можете использовать современные SDK от Auth0 для правильной реализации и использования JWT, зная, что они соответствуют последним передовым практикам в отрасли и регулярно обновляются для устранения известных угроз безопасности.

Например, SDK Auth0 для одностраничных приложений предоставляет метод извлечения информации о пользователе из токена идентификатора, auth0 . получить пользователя .

Если вы хотите попробовать платформу Auth0, создайте бесплатную учетную запись и приступайте к работе! С бесплатной учетной записью вы получите доступ к следующим функциям:

Чтобы узнать больше о JWT, их внутренней структуре, различных типах алгоритмов, которые можно использовать с ними, и других распространенных способах их использования, ознакомьтесь с Руководством по JWT.

Читайте также: