Цифровой паспорт продукта не всем показывает одно и то же. Покупательница видит общедоступные данные. Ремонтная мастерская или компания по восстановлению видит больше. Орган рыночного надзора видит всё. Это уже прояснено, и европейские стандарты теперь прямо это закрепляют.
Более интересный вопрос звучит не так громко: если кому-то раскрываются защищённые поля, выходящие за рамки общедоступных данных, может ли он подтвердить, что именно эти поля являются подлинными? Или ему приходится полагаться на то, что платформа правильно отобрала их и передала без изменений?
Для большинства платформ честный ответ звучит так: доверие. Мы построили нашу платформу так, чтобы ответом было «доказательство» - не только для общедоступных полей, но и для каждого поля, которое добавляется только при раскрытии. Почему это различие имеет значение и почему мы выбрали для этого более трудоемкий путь.
Правило доступа одинаково соблюдается всеми
EN 18239, европейский стандарт, регулирующий права доступа, безопасность и конфиденциальность в DPP, требует управления доступом для каждого элемента данных: для каждого поля существует правило, определяющее, кто имеет право его просматривать. Это правильное требование, и выполнить его несложно. Какой статус вообще имеют эти стандарты, мы подробно разобрали в статье «Гармонизированные стандарты».
Обычно это достигается с помощью фильтрации на стороне сервера. Сервер знает, кто запрашивает данные, проверяет, что этот человек имеет право видеть, и возвращает именно этот фрагмент. Управление доступом: выполнено. Больше стандарт ничего не требует.
Но есть один нюанс, о котором стандарт не заботится: фрагмент поступает без подписи. Читатель получает подготовленный специально для него фрагмент и должен верить, что сервер честно его отобрал и по пути ничего не изменил. Для общедоступной памятки это нормально. Но для значения, на котором переработчик основывает цену на подержанную батарею, это слишком большая вера.
Где одиночная подпись достигает своих пределов
Очевидным решением является подписание данных. Для обоих концов шкалы хорошо подходит обычная подпись: подписать общедоступный фрагмент, подписать полный набор данных, и оба проверяются по открытому ключу без участия сервера. Как это происходит в деталях, описано в статье «Подписи и сертификаты в DPP».
Проблема возникает в середине. Подпись на весь документ охватывает ровно один набор полей - именно те, которые были доступны на момент подписания. Если авторизованному читателю дополнительно раскрыть защищённое поле, это поле окажется за пределами подписанного набора и дойдёт до него без защиты. Если же с самого начала подписать полный набор данных, подпись, конечно, охватит всё, но тогда придётся показывать всё всем.
Таким образом, промежуточные звенья остаются за бортом: ремонтная мастерская, страховщик, компания по переработке отходов. Если бы нужно было заранее подписать каждую возможную комбинацию «кто что видит», потребовался бы отдельный подписанный документ для каждой комбинации, а количество комбинаций растёт в геометрической прогрессии с каждой новой группой доступа. Никто так не поступает. Приходится возвращаться к неподписанному серверному фильтру, и промежуточное звено вновь опирается на доверие.
Подписывать каждое поле по отдельности
Существует более удачная конструкция, и именно на ней мы строим нашу платформу. Вместо того чтобы подписывать готовый документ целиком, издатель в ходе одного цикла подписи отдельно определяет каждое поле (для знатоков стандартов: сертификат W3C ecdsa-sd-2023 для выборочного раскрытия).
Каждый вид начинается с общедоступного ядра
Каждый вид начинается с одних и тех же общедоступных полей. То, что читатель видит сверх этого, добавляется поле за полем, и каждое из этих полей по-прежнему ведёт к открытому ключу издателя - в автономном режиме, без повторной подписи и без доверия к организации, скомпоновавшей данный вид. Поля, на которые нет права, просто отсутствуют. Не зачеркнуты, а вовсе отсутствуют, и никакой информации о них не просачивается.
Почему «непрерывность» - это весь смысл
Представьте себе нотариуса, который заверит не письмо целиком, а каждый абзац по отдельности. Открытое письмо получает каждый. Тот, кто имеет право на большее, получает дополнительные абзацы, и каждый из них по-прежнему несет печать того же нотариуса. При обычном подходе платформа перепечатывает эти абзацы для вас, и то, что доходит до вас, несет только её слово.
Почему в этом случае важна именно «ненарушенность», стоит объяснить подробнее. Целая печать не означает, что содержание верно. Она говорит: именно это написал составитель, и с тех пор никто не изменил ни одной буквы. Таким образом, из круга доверия исключается каждый, кто просто передавал документ дальше - промежуточный хранилище, сеть, архив, мы. Кто именно передал вам паспорт, уже не имеет значения.
А печать - это бинарный показатель. Она либо цела, либо нет, полуразрушенной печати не бывает. Если она сломается, вы не узнаете, какая именно строка была изменена, а только то, что больше нельзя доверять всему документу целиком. Поэтому разница в том, поступят ли к вам дополнительные поля с печатью или без неё, не является постепенной: без печати они не являются менее достоверными - они вообще не являются достоверными.
Оба способа просмотра
Каждый может проверить это самостоятельно. Transpareo Time Machine - это наше приложение с открытым исходным кодом для просмотра паспортов продуктов: оно пролистывает историю версий паспорта и при этом пересчитывает каждую подпись в браузере пользователя, не обращаясь к нашему серверу. В приложении публично доступны два примера паспортов. Паспорт футболки содержит подпись, охватывающую весь документ, а паспорт батареи - раскрытие информации по отдельным полям.
Обе спецификации являются открытыми стандартами W3C: eddsa-jcs-2022 для подписи всего документа, ecdsa-sd-2023 для раскрытия информации по полям. Реализовать их может любой желающий. Трудоемкость - вот причина, по которой многие не будут этого делать: подпись, охватывающая весь документ, значительно дешевле в создании и эксплуатации, и тем, кто предоставляет только открытые данные, этого вполне достаточно.
То, что Time Machine поддерживает оба метода, сделано намеренно и так и останется. Она не принадлежит ни одной платформе. Проверяющий орган, принимающий только более дорогостоящий метод, стал бы инструментом только для нас и ни для кого больше.
Кому раскрываются защищённые поля
Стоит задаться вопросом, кому вообще раскрывается какая-либо информация помимо общедоступных данных. Не случайной покупательнице - ей предоставляется общедоступный паспорт. Это переработчик, который оценивает стоимость подержанного аккумуляторного блока; страховщик, который рассчитывает стоимость риска; предприятие по вторичной переработке, которое сортирует химические вещества; государственный орган, который ведёт дело. Именно эти лица принимают решения, от которых зависят деньги или безопасность.
И именно эти поля в обычном подходе остаются незащищёнными. Тот, у кого больше всего причин требовать криптографического подтверждения, не получает его как раз для тех полей, на которых основано его решение.
Мы считаем, что знак проверки должен означать одно и то же для всех. Надпись «Проверено Transpareo» на расширенном отчёте ремонтной мастерской означает то же самое, что и на публичном паспорте покупательницы: каждая отображаемая область получена от эмитента и с тех пор не подвергалась изменениям. Печать, которая ставится только на публичные поля, - это печать наполовину.
Больше, чем требует стандарт
Скажем прямо: ничего из этого не предписывается. ## СтандартEN 18239 требует, чтобы доступ контролировался, и серверный фильтр безупречно контролирует доступ. Кроме того, обеспечение возможности криптографической проверки открытых полей - это то, что мы делаем сверх нормы, а не просто галочка, которую от нас требует нормативный акт.
Именно поэтому об этом стоит упомянуть. Было бы легко выполнить букву стандарта, предоставить серверный фильтр и объявить этот этап завершённым. Но мы предпочитаем, чтобы это обязательство действовало везде, где появляется печать. Ведь весь смысл подписанного пропуска заключается в том, что никому не нужно доверять платформе. Исключение среднего уровня из правил возвращает именно то доверие, которое подпись должна была устранить.
Тот же принцип позволяет забыть об одном поле
Определение каждого поля в отдельности влечёт за собой второе свойство, и именно его требует европейское законодательство. Общий регламент по защите данных предоставляет людям право на удаление персональных данных. Набор данных, подписанный как единый блок, не может выполнить это требование без уничтожения собственной подписи.
Поскольку здесь каждое поле существует отдельно, можно удалить отдельное поле, в то время как всё остальное по-прежнему поддаётся проверке. Если персональные данные случайно попадают в паспорт, их можно аккуратно удалить, и паспорт остаётся действительным: не требуется переоформление, история не прерывается. Поля, хранение которых требуется законом, остаются на месте; то, что подлежит удалению, можно удалить по запросу даже спустя годы.
Тем не менее, это совершенно обычный паспорт
Ничто из этого не делает паспорт каким-то особым объектом, который могут открыть только наши инструменты. Он остаётся верифицируемым удостоверением (Verifiable Credential) в формате JSON-LD - формате, к которому стремится мир веб-стандартов, и том же формате, который используют Протокол прозрачности ООН (UN Transparency Protocol) и остальная среда W3C.
Таким образом, паспорт, который покупательница сканирует в браузере, - это тот же самый объект, который может считывать партнёр по информационному пространству, и любой проверяющий, работающий в соответствии со стандартами, может его проверить, а не только наши специалисты. Дополнительная безопасность ничего не стоит читателю и никого не связывает с нами.
Почему это сложно с технической точки зрения
Прежде всего, чтобы не сложилось ложное впечатление: мы не изобрели этот метод. ecdsa-sd-2023 - это открытая спецификация W3C, лежащая в его основе криптография не является нашей разработкой, и любой, кто хочет её реализовать, может ознакомиться с ней. Сложно не придумать идею. Сложно реализовать её так, чтобы паспорт по-прежнему работал через десять лет. Именно в этом и заключается работа, и об этом можно сказать кое-что полезное.
Разница кажется незначительной, но она меняет саму основу: обычная подпись производит вычисления над байтами документа. Селективное раскрытие вычисляется на основе содержащихся в документе утверждений. Перед подписанием паспорт приводится в стандартизированную форму, в которой каждое утверждение представлено в виде отдельного, самостоятельного предложения. Только благодаря этому можно опустить одно предложение, не повредив остальные.
В результате возникает проблема, которой нет у байтовой подписи: та же самая стандартизированная форма должна точно воспроизвестись через десять лет. Не приблизительно, а символ за символом, иначе подтверждение больше не будет соответствовать. На пути этому стоят три препятствия, и все три кажутся незначительными.
Числа теряют свой тип. Если записать число просто в формате JSON, то по ходу дела теряется информация о том, каким именно было это число. Такое значение, как 2.0, после прохождения через JSON возвращается как 2. Для человека это одно и то же, но для стандартизированной формы - другое предложение, и проверка заканчивается неудачей.
Названия сами по себе ещё не означают смысла. Чтобы сформировалась стандартизированная форма, каждое имя поля должно соотноситься с однозначным значением. Если одно из них отсутствует, поле при преобразовании незаметно исчезает. Оно тогда остаётся в паспорте, но подтверждение его не охватывает, и никто этого не замечает.
Значения обычно находятся в сети. Это сопоставление хранится в словаре, который большинство инструментов загружают из сети во время проверки. Тот, кто поступает таким образом, ставит проверку своего паспорта в зависимость от того, будет ли чужой адрес отвечать через десять лет, причём без изменений.
Как мы это решили
Мы устранили эти три проблемы у истоков, вместо того чтобы исправлять их позже.
Типы. Каждое значение записывается с указанием его типа, и публикация прерывается, как только в стандартизированной форме появляется хотя бы одно число без указания типа. Таким образом, ошибка выявляется сразу, когда она стоит одну строку, а не спустя годы в виде необъяснимого нарушения проверки.
Словари. Каждый словарь, на который ссылается паспорт, хранится у нас локально и никогда не загружается из сети. Неизвестный адрес приводит к жесткому прерыванию процесса подписи, а не к незаметному возврату к пустому результату.
Идентификаторы. Каждый узел в документе имеет стабильный идентификатор, благодаря чему стандартизированная форма остается воспроизводимой, а не требует присвоения новых вспомогательных имен при каждом проходе.
Самая деликатная часть заключается в принципе «Bring Your Own Key» (Используй свой собственный ключ). Для каждой выдачи требуется дополнительный кратковременный ключ, с помощью которого отдельно подписываются поля, подлежащие раскрытию. Этот ключ генерирует и удаляет сам выдающий. Если бы он находился у нас, мы могли бы задним числом придумывать отдельные поля, и независимость подписи экспонента осталась бы лишь на словах. Мы проверяем возвращаемое подтверждение по сохраненному открытому ключу, прежде чем доверять ему.
Каждый паспорт содержит два таких подтверждения: одно от эмитента и одно от Transpareo, и каждое из них выводится независимо для просмотра читателем. Две подписи, два независимых друг от друга авторитета - даже для одного отдельно раскрытого поля.
Для нас эти затраты оправданы. Мы не добавили возможность проверки задним числом; платформа с самого начала разрабатывалась с учётом этого. Каждый паспорт при публикации подписывается и привязывается к предыдущей версии. Неизменяемый десятилетний архив создан и вступает в действие, как только паспорта регистрируются в реестре EU-DPP. Подписка каждого поля вместо всего блока является расширением этого ядра, а не наслоением на то, что изначально не было для этого предназначено.
Где мы находимся
Если свести всё к сути, выбор прост. Вы можете раскрыть защищённые поля и попросить читателя довериться вашему фильтру - это соответствует стандарту. Или вы можете раскрыть их и сразу предоставить доказательство - это отвечает более высоким требованиям, которых, по нашему мнению, заслуживают эти поля.
Мы выбрали предоставление доказательства для каждого читателя, потому что печать должна означать одно и то же, независимо от того, кто на неё смотрит. Для тех, кто хочет увидеть, как это работает: две демонстрации, ссылки на которые приведены выше, проверяются прямо в браузере, в автономном режиме, исключительно с помощью открытого ключа.
